174 5. IJc/by picrwwc ł rorkhid ni cenniki
.... v, sq różna, do liczby wszystkich takich par, gdzie f przebiega zbiór wszystkich funkcji z S do S i v0 przebiega zbiór S, jest mniejszy od e~x.
Dowód. Liczba wszystkich par jest równa rH *, gdyż liczbę x0 możemy wybrać na r sposobów oraz dla każdego argumentu at, wybranego spośród r różnych elementów v g S, wartość /(.v) możemy wybrać też na r sposobów. A ile jest par {f, .v0), dla których wszystkie wartości x0, xl9 .... x, są różne? Liczbę jc0 możemy wybrać na r sposobów, wartość f(x0) = xt możemy wybrać na r — I sposobów (gdyż nie może ona być równa x0), wartość f(xt) = xz możemy wybrać na r - 2 sposoby itd., aż określimy wartości f(x) dla x = x0, xlt .... Xf_ j. Wartość f(x) dla pozostałych r — / argumentów x jest dowolna, tzn. istnieje rT~l sposobów wybrania tych wartości. Stąd wynika, żc całkowita liczba sposobów wybrania jc0 i określenia wartości f(x) tak, by x0, xit...»x, były różne, wynosi
J-0
a szukany stosunek liczby par o żądanej własności do liczby wszystkich par (tzn. powyższa liczba podzielona przez rr+1) wynosi
Twierdzenie mówi, że logarytm tej liczby jest mniejszy od —A (gdzie /= 1 + [\/2Ar]). Aby dowieść twierdzenia, logarytmujemy iloczyn po prawej stronie i korzystamy z tego, że log(l — x) < — x dla 0 < x < 1 (geometrycznie oznacza to, że krzywa logarytmiczna leży poniżej stycznej do niej poprowadzonej w punkcie (1,0)). Korzystając ze wzoru na sumę pierwszych / liczb naturalnych, otrzymujemy
log
/(/+1) -/2 < 2r <
U2Xr):
2 r 2r 2r
czego należało dowieść. To kończy dowód twierdzenia.
= -A ,
Znaczenie twierdzenia 5.2.1 polega na tym, że daje ono oszacowanie przypuszczalnego czasu działania metody p, o ile założymy, że nasz wielomian zachowuje się tak, jak losowe przekształcenie ze zbioru Z/rZ w siebie. Zanim jednak zajmiemy się bliżej tym oszacowaniem, dokonamy drobnego ulepszenia metody p, co zwiększy jej efektywność.
Przypomnijmy, że metoda p polega na kolejnym obliczaniu xk — /(xk_j) i porównywaniu xk z wcześniejszymi xi tak długo, aż znajdziemy taką parę, że NWD(xk — Xj, ri) — r> 1. Ale dla dużych k obliczanie NWD(xk — Xj, n) dla wszystkich j <k pochłania dużo czasu. Pokażemy teraz,
•aIc można zmodyfikować ten algorytm, by dla każdego k wykonywać tylko •edno obliczenie największego wspólnego dzielnika. Przede wszystkim zauważ-I„yi że jeśli pewne indeksy k0 i j() spełniają kongruencję xkti m xh (mod r) dla pewnego dzielnika r|n, to tę samą kongruencję będą spełniały dowolne indeksy lc i / mające tę samą różnicę k-j = k0~ j0. Aby się o tym przekonać, wystarczy przyjąć k = k0 + m, j -j0 + m i m razy podziałać wielomianem / na obie strony kongruencji xko s xjo (mod r).
Opiszemy teraz sposób działania algorytmu p. Będziemy obliczać kolejne wartości xk i dla każdego k postępujemy w następujący sposób. Przypuśćmy, że k jest liczbą (h + l)-bitową, tzn. 2* ^ k < 2*" *. Niech j będzie największą liczbą A-bitową: /= 2* - 1. Porównujemy wtedy xk z tą szczególną liczbą Xj, tzn. obliczamy NWD(xk - Xj, n). Jeśli ten największy wspólny dzielnik jest nietrywialnym dzielnikiem n, to kończymy wykonywanie algorytmu, w przeciwnym przypadku zamiast k bierzemy k +1.
Tak zmodyfikowany algorytm ma tę przewagę nad poprzednim, że dla każdego k musimy obliczyć tylko jeden największy wspólny dzielnik. Jego wadą jest to, że prawdopodobnie nie wykryjemy za pierwszym razem liczby k0. dla której istnieje jQ < k0 taka, że NWD(xko - xjo,n) = r> 1. Jednakże taką parę xk, xJ} której różnica ma nietrywialny wspólny dzielnik z n, wykryjemy niedługo później. Mianowicie przypuśćmy, że liczba kQ ma h +1 bitów. Weź-my/ = 2*+1 - 1 i k=j+(k0-jQ) i zauważmy, że wtedy j jest największą liczbą (h + l)-bitową i k jest taką liczbą (A -I- 2)-bitową, że NWD(xk - xp ń) > 1. Zauważmy też, że k < 2k+1 = 4 • 2* < 4]^.
Przykład 2. Powróćmy do przykładu 1, ale tym razem porównujmy każdą liczbę xk tylko z liczbą xjf gdzie j jest największą liczbą < k, postaci 2* - 1. Dla n = 91, f(x) = x2 + 1 i jc0 = 1 mamy xk = 2, x2 = 5, x3 = 26, tak jak poprzednio, oraz jc4 = 40 (gdyż 262 + 1 = 40 (mod 91)). Postępując zgodnie z opisanym wyżej algorytmem, znajdziemy dzielnik liczby n, gdy obliczymy NWDfa - x3, n) = NWD (14,91) = 7.
Przykład 3. Rozłóżmy na czynniki liczbę 4087, używając do tego wielomianu f(x) = X2 + x + 1 i wartości początkowej jc0 = 2.
Rozwiązanie. Nasze obliczenia będą przebiegać w następujący sposób:
=/(2) = 7; NWD(xl - % n) = NWD(1 - 2,4087) = 1;
*2 =/(7) = 57; WD(jc2 - *lt n) = OTW>(57 - 7,4087) = 1;
*3 =/(57) = 3307; NWD(xz - *lf n) = NMD(3307 - 7,4087) = I; m/(3307) s 2745 (mod 4087); NWD(xA - % n) =
= NWD (2745 - 3307,4087) = 1;
*5 s/(2745) a 1343 (mod 4087); NWD(x5 - *3, n) =
«JVH7)(1343 - 3307,4087) = 1;
*6 s/(1343) a 2626 (mod 4087); NWD(x6 - % n) =
= NWD (2626 - 3307,4087) « 1;