Testy pierwszości. Liczby pseudopierwsze Dicksona drugiego rodzaju: Różnice pomiędzy wersjami

Z Henryk Dąbrowski
Przejdź do nawigacji Przejdź do wyszukiwania
Linia 7: Linia 7:
 
== Podzielność wyrazów <math>V_n (P, Q)</math> przez liczbę pierwszą nieparzystą ==
 
== Podzielność wyrazów <math>V_n (P, Q)</math> przez liczbę pierwszą nieparzystą ==
  
<span style="font-size: 110%; font-weight: bold;">Twierdzenie N1</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Twierdzenie P1</span><br/>
 
Niech <math>p</math> będzie liczbą pierwszą nieparzystą.
 
Niech <math>p</math> będzie liczbą pierwszą nieparzystą.
  
Linia 58: Linia 58:
 
'''Punkt 5.'''
 
'''Punkt 5.'''
  
Z twierdzenia M7 wiemy, że
+
Z twierdzenia N7 wiemy, że
  
 
::<math>2^{n - 1} V_n = \sum_{k = 0}^{\lfloor n / 2 \rfloor} \binom{n}{2 k} P^{n - 2 k} D^k</math>
 
::<math>2^{n - 1} V_n = \sum_{k = 0}^{\lfloor n / 2 \rfloor} \binom{n}{2 k} P^{n - 2 k} D^k</math>
Linia 75: Linia 75:
  
  
<span style="font-size: 110%; font-weight: bold;">Twierdzenie N2</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Twierdzenie P2</span><br/>
 
Jeżeli <math>d</math> jest nieparzystym dzielnikiem <math>Q</math>, to dla <math>n \geqslant 1</math> jest
 
Jeżeli <math>d</math> jest nieparzystym dzielnikiem <math>Q</math>, to dla <math>n \geqslant 1</math> jest
  
Linia 99: Linia 99:
 
:::::<math>\quad \: = 2 \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot D^{j / 2}</math>
 
:::::<math>\quad \: = 2 \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot D^{j / 2}</math>
  
Rozpatrując powyższą równość modulo <math>Q</math>, dostajemy (zobacz M46)
+
Rozpatrując powyższą równość modulo <math>Q</math>, dostajemy (zobacz N46)
  
 
::<math>2^{n - 1} V_n \equiv \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot (P^2)^{j / 2}</math>
 
::<math>2^{n - 1} V_n \equiv \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot (P^2)^{j / 2}</math>
Linia 124: Linia 124:
  
  
<span style="font-size: 110%; font-weight: bold;">Twierdzenie N3</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Twierdzenie P3</span><br/>
 
Niech <math>D = P^2 - 4 Q \neq 0</math>, a <math>(D \mid p)</math> oznacza symbol Legendre'a, gdzie <math>p</math> jest liczbą pierwszą nieparzystą i <math>p \nmid Q</math>. Mamy
 
Niech <math>D = P^2 - 4 Q \neq 0</math>, a <math>(D \mid p)</math> oznacza symbol Legendre'a, gdzie <math>p</math> jest liczbą pierwszą nieparzystą i <math>p \nmid Q</math>. Mamy
  
Linia 139: Linia 139:
 
'''Punkt 1.'''
 
'''Punkt 1.'''
  
Zauważmy, że przypadek gdy <math>p \mid Q</math>, omówiliśmy w&nbsp;twierdzeniu poprzednim. Z&nbsp;założenia <math>p</math> jest liczbą pierwszą nieparzystą. Z&nbsp;twierdzenia M7, w&nbsp;przypadku nieparzystego <math>n = p</math>, otrzymujemy
+
Zauważmy, że przypadek gdy <math>p \mid Q</math>, omówiliśmy w&nbsp;twierdzeniu poprzednim. Z&nbsp;założenia <math>p</math> jest liczbą pierwszą nieparzystą. Z&nbsp;twierdzenia N7, w&nbsp;przypadku nieparzystego <math>n = p</math>, otrzymujemy
  
 
::<math>2^{p - 1} V_p = P^p + \binom{p}{2} P^{p - 2} D + \binom{p}{4} P^{p - 4} D^2 + \ldots + p P D^{(p - 1) / 2}</math>
 
::<math>2^{p - 1} V_p = P^p + \binom{p}{2} P^{p - 2} D + \binom{p}{4} P^{p - 4} D^2 + \ldots + p P D^{(p - 1) / 2}</math>
  
Ponieważ dla <math>k \in [1, p - 1]</math> jest (zobacz M43)
+
Ponieważ dla <math>k \in [1, p - 1]</math> jest (zobacz N43)
  
 
::<math>\binom{p}{k} \equiv 0 \pmod{p}</math>
 
::<math>\binom{p}{k} \equiv 0 \pmod{p}</math>
Linia 164: Linia 164:
  
  
Dla parzystego <math>n = p + 1</math> otrzymujemy z&nbsp;twierdzenia M7
+
Dla parzystego <math>n = p + 1</math> otrzymujemy z&nbsp;twierdzenia N7
  
 
::<math>2^p V_{p + 1} = P^{p + 1} + \binom{p + 1}{2} P^{p - 1} D + \binom{p + 1}{4} P^{p - 3} D^2 + \ldots + \binom{p + 1}{p - 1} P^2 D^{(p - 1) / 2} + D^{(p + 1) / 2}</math>
 
::<math>2^p V_{p + 1} = P^{p + 1} + \binom{p + 1}{2} P^{p - 1} D + \binom{p + 1}{4} P^{p - 3} D^2 + \ldots + \binom{p + 1}{p - 1} P^2 D^{(p - 1) / 2} + D^{(p + 1) / 2}</math>
  
Ponieważ dla <math>k \in [2, p - 1]</math> jest (zobacz M44)
+
Ponieważ dla <math>k \in [2, p - 1]</math> jest (zobacz N44)
  
 
::<math>\binom{p + 1}{k} \equiv 0 \pmod{p}</math>
 
::<math>\binom{p + 1}{k} \equiv 0 \pmod{p}</math>
Linia 187: Linia 187:
 
'''Punkt 3.'''
 
'''Punkt 3.'''
  
Dla parzystego <math>n = p - 1</math> otrzymujemy z&nbsp;twierdzenia M7
+
Dla parzystego <math>n = p - 1</math> otrzymujemy z&nbsp;twierdzenia N7
  
 
::<math>2^{p - 2} V_{p - 1} = P^{p - 1} + \binom{p - 1}{2} P^{p - 3} D + \binom{p - 1}{4} P^{p - 5} D^2 + \ldots + \binom{p - 1}{p - 3} P^2 D^{(p - 3) / 2} + D^{(p - 1) / 2}</math>
 
::<math>2^{p - 2} V_{p - 1} = P^{p - 1} + \binom{p - 1}{2} P^{p - 3} D + \binom{p - 1}{4} P^{p - 5} D^2 + \ldots + \binom{p - 1}{p - 3} P^2 D^{(p - 3) / 2} + D^{(p - 1) / 2}</math>
  
Ponieważ dla <math>k \in [0, p - 1]</math> jest (zobacz M45)
+
Ponieważ dla <math>k \in [0, p - 1]</math> jest (zobacz N45)
  
 
::<math>\binom{p - 1}{k} \equiv (- 1)^k \pmod{p}</math>
 
::<math>\binom{p - 1}{k} \equiv (- 1)^k \pmod{p}</math>
Linia 237: Linia 237:
  
  
Aby zapisać punkty 2. i 3. twierdzenia N3 (i tylko te punkty) w&nbsp;zwartej formie, musimy założyć, że <math>\gcd (p, D) = 1</math>. Otrzymujemy<br/>
+
Aby zapisać punkty 2. i 3. twierdzenia P3 (i tylko te punkty) w&nbsp;zwartej formie, musimy założyć, że <math>\gcd (p, D) = 1</math>. Otrzymujemy<br/>
<span style="font-size: 110%; font-weight: bold;">Twierdzenie N4</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Twierdzenie P4</span><br/>
 
Jeżeli <math>p</math> jest liczbą pierwszą nieparzystą i <math>\gcd (p, Q D) = 1</math>, to
 
Jeżeli <math>p</math> jest liczbą pierwszą nieparzystą i <math>\gcd (p, Q D) = 1</math>, to
  
Linia 249: Linia 249:
 
== Liczby pseudopierwsze Dicksona drugiego rodzaju ==
 
== Liczby pseudopierwsze Dicksona drugiego rodzaju ==
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N5</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P5</span><br/>
Z twierdzenia N4 wiemy, że dla liczb pierwszych nieparzystych takich, że <math>p \nmid Q D</math> jest
+
Z twierdzenia P4 wiemy, że dla liczb pierwszych nieparzystych takich, że <math>p \nmid Q D</math> jest
  
 
::<math>V_{p - (D \mid p)} \equiv 2 Q^{(1 - (D \mid p)) / 2} \pmod{p}</math>
 
::<math>V_{p - (D \mid p)} \equiv 2 Q^{(1 - (D \mid p)) / 2} \pmod{p}</math>
Linia 262: Linia 262:
  
  
<span style="font-size: 110%; font-weight: bold;">Definicja N6</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Definicja P6</span><br/>
 
Powiemy, że liczba złożona nieparzysta <math>m</math> jest liczbą pseudopierwszą Dicksona drugiego rodzaju dla parametrów <math>P</math> i <math>Q</math><ref name="D2PSP3"/> (D2PSP(<math>P, Q</math>)), jeżeli <math>\gcd (m, Q D) = 1</math> i
 
Powiemy, że liczba złożona nieparzysta <math>m</math> jest liczbą pseudopierwszą Dicksona drugiego rodzaju dla parametrów <math>P</math> i <math>Q</math><ref name="D2PSP3"/> (D2PSP(<math>P, Q</math>)), jeżeli <math>\gcd (m, Q D) = 1</math> i
  
Linia 271: Linia 271:
  
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N7</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P7</span><br/>
Wykorzystując funkcje <code>jacobi(a, n)</code> i <code>modLucas(n, P, Q, m)</code> (zobacz J47, M15) możemy napisać prosty program do testowania pierwszości liczb na podstawie twierdzenia N4.
+
Wykorzystując funkcje <code>jacobi(a, n)</code> i <code>modLucas(n, P, Q, m)</code> (zobacz J47, N15) możemy napisać prosty program do testowania pierwszości liczb na podstawie twierdzenia P4.
  
 
  <span style="font-size: 90%; color:black;">isPrimeOr<span style="background-color: #fee481;">D2PSP</span>(m, P, Q) =  
 
  <span style="font-size: 90%; color:black;">isPrimeOr<span style="background-color: #fee481;">D2PSP</span>(m, P, Q) =  
Linia 285: Linia 285:
  
  
<span style="font-size: 110%; font-weight: bold;">Przykład N8</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Przykład P8</span><br/>
 
Poniższa tabela zawiera najmniejsze liczby pseudopierwsze Dicksona drugiego rodzaju dla różnych parametrów <math>P</math> i <math>Q</math>.
 
Poniższa tabela zawiera najmniejsze liczby pseudopierwsze Dicksona drugiego rodzaju dla różnych parametrów <math>P</math> i <math>Q</math>.
  
Linia 356: Linia 356:
  
  
<span style="font-size: 110%; font-weight: bold;">Przykład N9</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Przykład P9</span><br/>
 
Tabela przedstawia ilość liczb D2PSP(<math>P, Q</math>) mniejszych od <math>10^9</math>.
 
Tabela przedstawia ilość liczb D2PSP(<math>P, Q</math>) mniejszych od <math>10^9</math>.
  
Linia 421: Linia 421:
  
  
<span style="font-size: 110%; font-weight: bold;">Przykład N10</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Przykład P10</span><br/>
 
Tabele przedstawiają ilość liczb D2PSP( <math>1, Q</math> ) mniejszych od <math>10^9</math> dla <math>| Q | \leqslant 20</math>.
 
Tabele przedstawiają ilość liczb D2PSP( <math>1, Q</math> ) mniejszych od <math>10^9</math> dla <math>| Q | \leqslant 20</math>.
  
Linia 445: Linia 445:
 
== Zmodyfikowana metoda Selfridge'a wyboru parametrów <math>P</math> i <math>Q</math> ==
 
== Zmodyfikowana metoda Selfridge'a wyboru parametrów <math>P</math> i <math>Q</math> ==
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N11</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P11</span><br/>
Przykłady N9 i&nbsp;N10 pokazują, że w&nbsp;przypadku liczb pseudopierwszych Dicksona drugiego rodzaju dla parametrów <math>P, Q</math> należy unikać wyboru <math>Q = \pm 1</math> i <math>Q = - 2</math>. Niestety, metoda Selfridge'a dopuszcza wartość <math>Q = - 1</math>. Baillie i&nbsp;Wagstaff<ref name="BaillieWagstaff1"/> dostrzegają ten problem (zobacz tabelę nr 4 na stronie 1407) i&nbsp;„naprawiają” metodę Selfridge'a wprowadzając następującą poprawkę: jeśli otrzymamy parę <math>(P, Q) = (1, -1)</math>, to należy zamienić ją na parę <math>(P, Q) = (5, 5)</math>. Ponieważ liczba nieparzysta <math>m</math> jest LPSP(<math>1, - 1</math>) / SLPSP(<math>1, - 1</math>) wtedy i&nbsp;tylko wtedy, gdy <math>m</math> jest LPSP(<math>5, 5</math>) / SLPSP(<math>5, 5</math>) (zobacz N18 i&nbsp;N19), to taka poprawka nie zmienia wyników wcześniejszych obliczeń wykorzystujących funkcje LucasTest(m) i&nbsp;StrongLucasTest(m).
+
Przykłady P9 i&nbsp;P10 pokazują, że w&nbsp;przypadku liczb pseudopierwszych Dicksona drugiego rodzaju dla parametrów <math>P, Q</math> należy unikać wyboru <math>Q = \pm 1</math> i <math>Q = - 2</math>. Niestety, metoda Selfridge'a dopuszcza wartość <math>Q = - 1</math>. Baillie i&nbsp;Wagstaff<ref name="BaillieWagstaff1"/> dostrzegają ten problem (zobacz tabelę nr 4 na stronie 1407) i&nbsp;„naprawiają” metodę Selfridge'a wprowadzając następującą poprawkę: jeśli otrzymamy parę <math>(P, Q) = (1, -1)</math>, to należy zamienić ją na parę <math>(P, Q) = (5, 5)</math>. Ponieważ liczba nieparzysta <math>m</math> jest LPSP(<math>1, - 1</math>) / SLPSP(<math>1, - 1</math>) wtedy i&nbsp;tylko wtedy, gdy <math>m</math> jest LPSP(<math>5, 5</math>) / SLPSP(<math>5, 5</math>) (zobacz P18 i&nbsp;P19), to taka poprawka nie zmienia wyników wcześniejszych obliczeń wykorzystujących funkcje LucasTest(m) i&nbsp;StrongLucasTest(m).
  
 
Innym sposobem usunięcia przypadku <math>Q = - 1</math> jest wyszukiwanie liczby <math>a_k</math>, dla której <math>(a_k \mid m) = - 1</math> od <math>a_k > 5</math>. To oznacza zmianę metody i&nbsp;oczywiście zmieni wyniki wcześniejszych obliczeń funkcji LucasTest(m) i&nbsp;StrongLucasTest(m).
 
Innym sposobem usunięcia przypadku <math>Q = - 1</math> jest wyszukiwanie liczby <math>a_k</math>, dla której <math>(a_k \mid m) = - 1</math> od <math>a_k > 5</math>. To oznacza zmianę metody i&nbsp;oczywiście zmieni wyniki wcześniejszych obliczeń funkcji LucasTest(m) i&nbsp;StrongLucasTest(m).
Linia 477: Linia 477:
  
  
<span style="font-size: 110%; font-weight: bold;">Zadanie N12</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Zadanie P12</span><br/>
 
Pokazać, że dla dowolnej niekwadratowej liczby nieparzystej <math>m</math> jest: <code>MethodA(m, 9) = MethodA(m, -11)</code>.
 
Pokazać, że dla dowolnej niekwadratowej liczby nieparzystej <math>m</math> jest: <code>MethodA(m, 9) = MethodA(m, -11)</code>.
  
Linia 522: Linia 522:
  
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N13</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P13</span><br/>
 
Podobnie, jak w&nbsp;przypadku liczb pseudopierwszych Lucasa LPSP(<math>P, Q</math>) i&nbsp;w&nbsp;przypadku liczb silnie pseudopierwszych Lucasa SLPSP(<math>P, Q</math>), tak i&nbsp;w&nbsp;przypadku liczb pseudopierwszych Dicksona drugiego rodzaju D2PSP(<math>P, Q</math>) możemy testować pierwszość liczby <math>m</math>, wybierając liczby <math>P, Q</math> losowo lub zastosować wybraną metodę postępowania. Przyjmując zmodyfikowaną postać funkcji <code>MethodA()</code>, możemy łatwo napisać program:
 
Podobnie, jak w&nbsp;przypadku liczb pseudopierwszych Lucasa LPSP(<math>P, Q</math>) i&nbsp;w&nbsp;przypadku liczb silnie pseudopierwszych Lucasa SLPSP(<math>P, Q</math>), tak i&nbsp;w&nbsp;przypadku liczb pseudopierwszych Dicksona drugiego rodzaju D2PSP(<math>P, Q</math>) możemy testować pierwszość liczby <math>m</math>, wybierając liczby <math>P, Q</math> losowo lub zastosować wybraną metodę postępowania. Przyjmując zmodyfikowaną postać funkcji <code>MethodA()</code>, możemy łatwo napisać program:
  
Linia 539: Linia 539:
  
  
<span style="font-size: 110%; font-weight: bold;">Przykład N14</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Przykład P14</span><br/>
Poniżej przedstawiamy najmniejsze liczby D2PSP(<math>P, Q</math>) oraz ilości tych liczb w&nbsp;zależności od wartości parametru <code>start</code> w&nbsp;funkcji <code>MethodA(m, start)</code>. Ponieważ <code>MethodA(m, 9) = MethodA(m, -11)</code> (zobacz N12), to pominęliśmy przypadek <code>MethodA(m, -11)</code>. Dla porównania w&nbsp;następnym przykładzie przedstawimy analogiczne zestawienia dla liczb SLPSP(<math>P, Q</math>).
+
Poniżej przedstawiamy najmniejsze liczby D2PSP(<math>P, Q</math>) oraz ilości tych liczb w&nbsp;zależności od wartości parametru <code>start</code> w&nbsp;funkcji <code>MethodA(m, start)</code>. Ponieważ <code>MethodA(m, 9) = MethodA(m, -11)</code> (zobacz P12), to pominęliśmy przypadek <code>MethodA(m, -11)</code>. Dla porównania w&nbsp;następnym przykładzie przedstawimy analogiczne zestawienia dla liczb SLPSP(<math>P, Q</math>).
  
  
Linia 683: Linia 683:
 
== Silnie pseudopierwsze liczby Lucasa i&nbsp;zmodyfikowana metoda Selfridge'a ==
 
== Silnie pseudopierwsze liczby Lucasa i&nbsp;zmodyfikowana metoda Selfridge'a ==
  
<span style="font-size: 110%; font-weight: bold;">Przykład N15</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Przykład P15</span><br/>
Poniżej przedstawiamy najmniejsze liczby SLPSP(<math>P, Q</math>) oraz ilości tych liczb w&nbsp;zależności od wartości parametru <code>start</code> w&nbsp;funkcji <code>MethodA(m, start)</code>. Ponieważ <code>MethodA(m, 9) = MethodA(m, -11)</code> (zobacz N12), to pominęliśmy przypadek <code>MethodA(m, -11)</code>.
+
Poniżej przedstawiamy najmniejsze liczby SLPSP(<math>P, Q</math>) oraz ilości tych liczb w&nbsp;zależności od wartości parametru <code>start</code> w&nbsp;funkcji <code>MethodA(m, start)</code>. Ponieważ <code>MethodA(m, 9) = MethodA(m, -11)</code> (zobacz P12), to pominęliśmy przypadek <code>MethodA(m, -11)</code>.
  
  
Linia 791: Linia 791:
  
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N16</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P16</span><br/>
Przyglądając się wierszom drugiej tabeli z&nbsp;przykładu N15, łatwo zauważamy, że w&nbsp;wierszach położonych blisko siebie często występują te same liczby. Zbadamy teraz, ile jest wspólnych liczb między poszczególnymi wierszami.
+
Przyglądając się wierszom drugiej tabeli z&nbsp;przykładu P15, łatwo zauważamy, że w&nbsp;wierszach położonych blisko siebie często występują te same liczby. Zbadamy teraz, ile jest wspólnych liczb między poszczególnymi wierszami.
  
 
Pokazana niżej tabela powstała po znalezienia wszystkich liczb <code>SLPSP(m, a)</code>, gdzie
 
Pokazana niżej tabela powstała po znalezienia wszystkich liczb <code>SLPSP(m, a)</code>, gdzie
Linia 859: Linia 859:
 
== Wzmocnienie testu BPSW ==
 
== Wzmocnienie testu BPSW ==
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N17</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P17</span><br/>
 
Dla wszystkich rozpatrywanych tutaj parametrów <code>start</code> takich, że
 
Dla wszystkich rozpatrywanych tutaj parametrów <code>start</code> takich, że
  
 
::<tt>start</tt> <math>\in \{</math><tt>"*"</tt><math>, -7, 9, 13, -15, 17, -19, 21, -23, 25, -27, 29, -31, 33 \}</math>
 
::<tt>start</tt> <math>\in \{</math><tt>"*"</tt><math>, -7, 9, 13, -15, 17, -19, 21, -23, 25, -27, 29, -31, 33 \}</math>
  
(czyli poza przypadkiem niezmodyfikowanej metody Selfridge'a – funkcja <code>MethodA(m, 5)</code>) znaleźliśmy <math>25</math> liczb pseudopierwszych Dicksona drugiego rodzaju. Większość z&nbsp;nich to liczby mniejsze od <math>10^{10}</math> (zobacz N14). Żadna z&nbsp;tych liczb nie jest silnie pseudopierwszą liczbą Lucasa (SLPSP) i&nbsp;nie zależy to od wyboru wartości parametru <code>start</code> w&nbsp;funkcji <code>StrongLucasTest(m, start)</code> (również dla <code>start = 5</code>).
+
(czyli poza przypadkiem niezmodyfikowanej metody Selfridge'a – funkcja <code>MethodA(m, 5)</code>) znaleźliśmy <math>25</math> liczb pseudopierwszych Dicksona drugiego rodzaju. Większość z&nbsp;nich to liczby mniejsze od <math>10^{10}</math> (zobacz P14). Żadna z&nbsp;tych liczb nie jest silnie pseudopierwszą liczbą Lucasa (SLPSP) i&nbsp;nie zależy to od wyboru wartości parametru <code>start</code> w&nbsp;funkcji <code>StrongLucasTest(m, start)</code> (również dla <code>start = 5</code>).
  
 
Przypomnijmy, że nie znamy liczb nieparzystych <math>m</math>, które byłyby jednocześnie liczbami silnie pseudopierwszymi (SPSP) i&nbsp;silnie pseudopierwszymi liczbami Lucasa (SLPSP) dla <math>m < 2^{64}</math>. Jest bardzo prawdopodobne, że równie rzadko występują liczby, które są jednocześnie silnie pseudopierwszymi liczbami Lucasa (SLPSP) i&nbsp;pseudopierwszymi liczbami Dicksona drugiego rodzaju (D2PSP). Stanowi to dobrą przesłankę do wzmocnienia testu BPSW.
 
Przypomnijmy, że nie znamy liczb nieparzystych <math>m</math>, które byłyby jednocześnie liczbami silnie pseudopierwszymi (SPSP) i&nbsp;silnie pseudopierwszymi liczbami Lucasa (SLPSP) dla <math>m < 2^{64}</math>. Jest bardzo prawdopodobne, że równie rzadko występują liczby, które są jednocześnie silnie pseudopierwszymi liczbami Lucasa (SLPSP) i&nbsp;pseudopierwszymi liczbami Dicksona drugiego rodzaju (D2PSP). Stanowi to dobrą przesłankę do wzmocnienia testu BPSW.
Linia 929: Linia 929:
 
== Uzupełnienie ==
 
== Uzupełnienie ==
  
Dowody twierdzeń N18 i&nbsp;N19 zostały oparte na pomyśle przedstawionym przez Bailliego, Fioriego i&nbsp;Wagstaffa<ref name="BaillieFioriWagstaff1"/>.<br/>
+
Dowody twierdzeń P18 i&nbsp;P19 zostały oparte na pomyśle przedstawionym przez Bailliego, Fioriego i&nbsp;Wagstaffa<ref name="BaillieFioriWagstaff1"/>.<br/>
<span style="font-size: 110%; font-weight: bold;">Twierdzenie N18</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Twierdzenie P18</span><br/>
 
Liczba nieparzysta <math>m</math> jest LPSP(<math>1, - 1</math>) wtedy i&nbsp;tylko wtedy, gdy <math>m</math> jest LPSP(<math>5, 5</math>).
 
Liczba nieparzysta <math>m</math> jest LPSP(<math>1, - 1</math>) wtedy i&nbsp;tylko wtedy, gdy <math>m</math> jest LPSP(<math>5, 5</math>).
  
 
{{Spoiler|Style = font-style: italic; font-weight: bold; color: olive; text-decoration: underline;|Show=Dowód|Hide=Ukryj dowód}}
 
{{Spoiler|Style = font-style: italic; font-weight: bold; color: olive; text-decoration: underline;|Show=Dowód|Hide=Ukryj dowód}}
W zadaniu M12 połóżmy <math>Q = 1</math> i&nbsp;konsekwentnie <math>P = 4 Q + 1 = 5</math>. Pierwszy z&nbsp;wypisanych wzorów przyjmie postać
+
W zadaniu N12 połóżmy <math>Q = 1</math> i&nbsp;konsekwentnie <math>P = 4 Q + 1 = 5</math>. Pierwszy z&nbsp;wypisanych wzorów przyjmie postać
  
 
::<math>U_{2 k} (5, 5) = 5^k U_{2 k} (1, - 1)</math>
 
::<math>U_{2 k} (5, 5) = 5^k U_{2 k} (1, - 1)</math>
Linia 968: Linia 968:
  
  
<span style="font-size: 110%; font-weight: bold;">Twierdzenie N19</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Twierdzenie P19</span><br/>
 
Liczba nieparzysta <math>m</math> jest SLPSP(<math>1, - 1</math>) wtedy i&nbsp;tylko wtedy, gdy <math>m</math> jest SLPSP(<math>5, 5</math>).
 
Liczba nieparzysta <math>m</math> jest SLPSP(<math>1, - 1</math>) wtedy i&nbsp;tylko wtedy, gdy <math>m</math> jest SLPSP(<math>5, 5</math>).
  
 
{{Spoiler|Style = font-style: italic; font-weight: bold; color: olive; text-decoration: underline;|Show=Dowód|Hide=Ukryj dowód}}
 
{{Spoiler|Style = font-style: italic; font-weight: bold; color: olive; text-decoration: underline;|Show=Dowód|Hide=Ukryj dowód}}
W zadaniu M12 połóżmy <math>Q = 1</math> i&nbsp;konsekwentnie <math>P = 4 Q + 1 = 5</math>. Drugi, czwarty i&nbsp;trzeci z&nbsp;wypisanych wzorów przyjmą postać
+
W zadaniu N12 połóżmy <math>Q = 1</math> i&nbsp;konsekwentnie <math>P = 4 Q + 1 = 5</math>. Drugi, czwarty i&nbsp;trzeci z&nbsp;wypisanych wzorów przyjmą postać
  
 
::<math>U_{2 k + 1} (5, 5) = 5^k V_{2 k + 1} (1, - 1)</math>
 
::<math>U_{2 k + 1} (5, 5) = 5^k V_{2 k + 1} (1, - 1)</math>
Linia 1039: Linia 1039:
 
== Zestawienie funkcji ==
 
== Zestawienie funkcji ==
  
<span style="font-size: 110%; font-weight: bold;">Uwaga N20</span><br/>
+
<span style="font-size: 110%; font-weight: bold;">Uwaga P20</span><br/>
 
Poniżej przedstawiamy zestawienie najważniejszych funkcji, które wykorzystywaliśmy do testowania pierwszości liczb. Zauważmy, że wprowadziliśmy drugi parametr do funkcji, które wywołują funkcję <code>MethodA()</code> tak, aby możliwe było pełne wykorzystanie tej funkcji po zmodyfikowaniu i&nbsp;związane z&nbsp;tym poprawki.
 
Poniżej przedstawiamy zestawienie najważniejszych funkcji, które wykorzystywaliśmy do testowania pierwszości liczb. Zauważmy, że wprowadziliśmy drugi parametr do funkcji, które wywołują funkcję <code>MethodA()</code> tak, aby możliwe było pełne wykorzystanie tej funkcji po zmodyfikowaniu i&nbsp;związane z&nbsp;tym poprawki.
  

Wersja z 13:18, 17 lut 2024

12.07.2023



Podzielność wyrazów [math]\displaystyle{ V_n (P, Q) }[/math] przez liczbę pierwszą nieparzystą

Twierdzenie P1
Niech [math]\displaystyle{ p }[/math] będzie liczbą pierwszą nieparzystą.

●    jeżeli [math]\displaystyle{ \; p \mid P \; }[/math] [math]\displaystyle{ \text{i} \;\; p \mid Q , \; }[/math] to [math]\displaystyle{ \; p \mid V_n \; }[/math] dla [math]\displaystyle{ n \geqslant 1 }[/math]
●    jeżeli [math]\displaystyle{ \; p \mid P \; }[/math] [math]\displaystyle{ \text{i} \;\; p \nmid Q , \; }[/math] to [math]\displaystyle{ \; p \mid V_{2 n + 1} \; }[/math] i [math]\displaystyle{ \; p \nmid V_{2 n} }[/math]
●    jeżeli [math]\displaystyle{ \; p \nmid P \; }[/math] [math]\displaystyle{ \text{i} \;\; p \mid Q , \; }[/math] to [math]\displaystyle{ \; p \nmid V_n \; }[/math] dla [math]\displaystyle{ n \geqslant 0 }[/math]
●    jeżeli [math]\displaystyle{ \; p \mid Q , \; }[/math] to [math]\displaystyle{ \; p \mid V_n , }[/math] gdzie [math]\displaystyle{ n \geqslant 1 }[/math], wtedy i tylko wtedy, gdy [math]\displaystyle{ \; p \mid P }[/math]
●    jeżeli [math]\displaystyle{ \; p \nmid P \; }[/math] [math]\displaystyle{ \text{i} \;\; p \mid D , \; }[/math] to [math]\displaystyle{ \; p \nmid V_n \; }[/math] dla [math]\displaystyle{ n \geqslant 0 }[/math]

Założenie, że [math]\displaystyle{ p \nmid P }[/math] w ostatnim punkcie jest istotne. Gdy [math]\displaystyle{ \; p \mid P \; }[/math] i [math]\displaystyle{ \; p \mid D , \; }[/math] to [math]\displaystyle{ \; p \mid Q \; }[/math] i otrzymujemy punkt pierwszy.

Dowód

Punkt 1.

Ponieważ [math]\displaystyle{ V_1 = P }[/math], zatem [math]\displaystyle{ p \mid V_1 }[/math]. Dla [math]\displaystyle{ n \geqslant 2 }[/math] wyrażenie [math]\displaystyle{ V_n = P V_{n - 1} - Q V_{n - 2} }[/math] jest podzielne przez [math]\displaystyle{ p }[/math].

Punkt 2.

Indeksy nieparzyste. Indukcja matematyczna. Mamy [math]\displaystyle{ V_0 = 2 }[/math], [math]\displaystyle{ V_1 = P }[/math], [math]\displaystyle{ V_2 = P^2 - 2 Q }[/math] i [math]\displaystyle{ V_3 = P^3 - 3 P Q }[/math], zatem [math]\displaystyle{ p \mid V_1 }[/math] i [math]\displaystyle{ p \mid V_3 }[/math]. Zakładając, że [math]\displaystyle{ p \mid V_{2 n - 1} }[/math], z definicji ciągu [math]\displaystyle{ (V_k) }[/math] otrzymujemy dla [math]\displaystyle{ V_{2 n + 1} }[/math]

[math]\displaystyle{ V_{2 n + 1} = P V_{2 n} - Q V_{2 n - 1} }[/math]

Z założenia indukcyjnego wynika, że [math]\displaystyle{ p \mid V_{2 n + 1} }[/math], zatem na mocy zasady indukcji matematycznej twierdzenie jest prawdziwe dla wszystkich [math]\displaystyle{ n \geqslant 0 }[/math].

Indeksy parzyste. Indukcja matematyczna. Mamy [math]\displaystyle{ V_0 = 2 }[/math], [math]\displaystyle{ V_1 = P }[/math] i [math]\displaystyle{ V_2 = P^2 - 2 Q }[/math], zatem [math]\displaystyle{ p \nmid V_0 }[/math] i [math]\displaystyle{ p \nmid V_2 }[/math]. Zakładając, że [math]\displaystyle{ p \nmid V_{2 n} }[/math], z definicji ciągu [math]\displaystyle{ (V_k) }[/math] otrzymujemy dla [math]\displaystyle{ V_{2 n + 2} }[/math]

[math]\displaystyle{ V_{2 n + 2} = P V_{2 n + 1} - Q V_{2 n} }[/math]

Z założenia indukcyjnego wynika, że [math]\displaystyle{ p \nmid V_{2 n + 2} }[/math]. Zatem na mocy zasady indukcji matematycznej twierdzenie jest prawdziwe dla wszystkich liczb [math]\displaystyle{ n \geqslant 0 }[/math].

Punkt 3.

Indukcja matematyczna. Mamy [math]\displaystyle{ V_0 = 2 }[/math] i [math]\displaystyle{ V_1 = P }[/math], zatem [math]\displaystyle{ p \nmid V_0 }[/math] i [math]\displaystyle{ p \nmid V_1 }[/math]. Zakładając, że [math]\displaystyle{ p \nmid V_n }[/math], z definicji ciągu [math]\displaystyle{ (V_k) }[/math] otrzymujemy dla [math]\displaystyle{ V_{n + 1} }[/math]

[math]\displaystyle{ V_{n + 1} = P V_n - Q V_{n - 1} }[/math]

Z założenia indukcyjnego wynika, że [math]\displaystyle{ p \nmid V_{n + 1} }[/math], zatem na mocy zasady indukcji matematycznej twierdzenie jest prawdziwe dla wszystkich liczb [math]\displaystyle{ n \geqslant 0 }[/math].

Punkt 4.

Wynika z punktów pierwszego i trzeciego.

Punkt 5.

Z twierdzenia N7 wiemy, że

[math]\displaystyle{ 2^{n - 1} V_n = \sum_{k = 0}^{\lfloor n / 2 \rfloor} \binom{n}{2 k} P^{n - 2 k} D^k }[/math]
[math]\displaystyle{ \;\, = P^n + \binom{n}{2} P^{n - 2} D + \binom{n}{4} P^{n - 4} D^2 + \ldots }[/math]

Z założenia [math]\displaystyle{ p \mid D }[/math], zatem modulo [math]\displaystyle{ p }[/math] dostajemy

[math]\displaystyle{ 2^{n - 1} V_n \equiv P^n \pmod{p} }[/math]

Ponieważ [math]\displaystyle{ p \nmid P }[/math], zatem [math]\displaystyle{ p \nmid V_n }[/math]. Co należało pokazać.


Twierdzenie P2
Jeżeli [math]\displaystyle{ d }[/math] jest nieparzystym dzielnikiem [math]\displaystyle{ Q }[/math], to dla [math]\displaystyle{ n \geqslant 1 }[/math] jest

[math]\displaystyle{ V_n \equiv P^n \pmod{d} }[/math]

W szczególności, gdy liczba pierwsza nieparzysta [math]\displaystyle{ p }[/math] jest dzielnikiem [math]\displaystyle{ Q }[/math], to

[math]\displaystyle{ V_p \equiv P \pmod{p} }[/math]
Dowód

Oznaczmy [math]\displaystyle{ \delta = \sqrt{D} }[/math], zatem [math]\displaystyle{ 2 \alpha = P + \delta }[/math] i [math]\displaystyle{ 2 \beta = P - \delta }[/math]. Ze wzoru dwumianowego, mamy

[math]\displaystyle{ 2^n \alpha^n = (P + \delta)^n = \sum_{j = 0}^{n} \binom{n}{j} P^{n - j} \delta^j }[/math]
[math]\displaystyle{ 2^n \beta^n = (P - \delta)^n = \sum_{j = 0}^{n} \binom{n}{j} P^{n - j} (- \delta)^j }[/math]

Obliczając sumę powyższych wzorów, otrzymujemy

[math]\displaystyle{ 2^n (\alpha^n + \beta^n) = \sum_{j = 0}^{n} \binom{n}{j} P^{n - j} (\delta^j + (- \delta)^j) }[/math]
[math]\displaystyle{ \quad \: = \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot 2 \delta^j }[/math]
[math]\displaystyle{ \quad \: = 2 \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot D^{j / 2} }[/math]

Rozpatrując powyższą równość modulo [math]\displaystyle{ Q }[/math], dostajemy (zobacz N46)

[math]\displaystyle{ 2^{n - 1} V_n \equiv \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} P^{n - j} \cdot (P^2)^{j / 2} }[/math]
[math]\displaystyle{ \:\, \equiv P^n \underset{j \; \text{parzyste}}{\sum_{j = 0}^{n}} \binom{n}{j} }[/math]
[math]\displaystyle{ \:\, \equiv 2^{n - 1} P^n \pmod{Q} }[/math]

Czyli

[math]\displaystyle{ 2^{n - 1} (V_n - P^n) \equiv 0 \pmod{Q} }[/math]

Ponieważ [math]\displaystyle{ Q }[/math] dzieli [math]\displaystyle{ 2^{n - 1} (V_n - P^n) }[/math], to tym bardziej [math]\displaystyle{ d }[/math] dzieli [math]\displaystyle{ 2^{n - 1} (V_n - P^n) }[/math]. Z założenia [math]\displaystyle{ \gcd (d, 2^{n - 1}) = 1 }[/math], zatem [math]\displaystyle{ d }[/math] dzieli [math]\displaystyle{ V_n - P^n }[/math] (zobacz C74). Co należało pokazać.


W przypadku szczególnym, gdy [math]\displaystyle{ d = n = p }[/math], gdzie [math]\displaystyle{ p }[/math] jest nieparzystą liczbą pierwszą, otrzymujemy natychmiast (zobacz J21).

[math]\displaystyle{ V_p \equiv P^p \equiv P \pmod{p} }[/math]

Co należało pokazać.


Twierdzenie P3
Niech [math]\displaystyle{ D = P^2 - 4 Q \neq 0 }[/math], a [math]\displaystyle{ (D \mid p) }[/math] oznacza symbol Legendre'a, gdzie [math]\displaystyle{ p }[/math] jest liczbą pierwszą nieparzystą i [math]\displaystyle{ p \nmid Q }[/math]. Mamy

●    [math]\displaystyle{ V_p \equiv P \pmod{p} }[/math]
●    jeżeli [math]\displaystyle{ (D \mid p) = - 1 , \; }[/math] to [math]\displaystyle{ V_{p + 1} \equiv 2 Q \pmod{p} }[/math]
●    jeżeli [math]\displaystyle{ (D \mid p) = 1 , \; }[/math] to [math]\displaystyle{ V_{p - 1} \equiv 2 \pmod{p} }[/math]
Dowód

Punkt 1.

Zauważmy, że przypadek gdy [math]\displaystyle{ p \mid Q }[/math], omówiliśmy w twierdzeniu poprzednim. Z założenia [math]\displaystyle{ p }[/math] jest liczbą pierwszą nieparzystą. Z twierdzenia N7, w przypadku nieparzystego [math]\displaystyle{ n = p }[/math], otrzymujemy

[math]\displaystyle{ 2^{p - 1} V_p = P^p + \binom{p}{2} P^{p - 2} D + \binom{p}{4} P^{p - 4} D^2 + \ldots + p P D^{(p - 1) / 2} }[/math]

Ponieważ dla [math]\displaystyle{ k \in [1, p - 1] }[/math] jest (zobacz N43)

[math]\displaystyle{ \binom{p}{k} \equiv 0 \pmod{p} }[/math]

to modulo [math]\displaystyle{ p }[/math] dostajemy

[math]\displaystyle{ 2^{p - 1} V_p \equiv V_p \equiv P^p \equiv P \pmod{p} }[/math]

Punkt 2.

Zauważmy, że warunek [math]\displaystyle{ (D \mid p) = - 1 }[/math] nie może być spełniony, gdy [math]\displaystyle{ p \mid Q }[/math]. Istotnie, gdy [math]\displaystyle{ p \mid Q }[/math], to [math]\displaystyle{ D = P^2 - 4 Q \equiv P^2 \pmod{p} }[/math], czyli

[math]\displaystyle{ (D \mid p) = (P^2 \mid p) = (P \mid p)^2 = 0 , \; }[/math] gdy [math]\displaystyle{ p \mid P }[/math]

lub

[math]\displaystyle{ (D \mid p) = (P^2 \mid p) = (P \mid p)^2 = 1 , \; }[/math] gdy [math]\displaystyle{ p \nmid P }[/math]

i nie może być [math]\displaystyle{ (D \mid p) = - 1 }[/math].


Dla parzystego [math]\displaystyle{ n = p + 1 }[/math] otrzymujemy z twierdzenia N7

[math]\displaystyle{ 2^p V_{p + 1} = P^{p + 1} + \binom{p + 1}{2} P^{p - 1} D + \binom{p + 1}{4} P^{p - 3} D^2 + \ldots + \binom{p + 1}{p - 1} P^2 D^{(p - 1) / 2} + D^{(p + 1) / 2} }[/math]

Ponieważ dla [math]\displaystyle{ k \in [2, p - 1] }[/math] jest (zobacz N44)

[math]\displaystyle{ \binom{p + 1}{k} \equiv 0 \pmod{p} }[/math]

to modulo [math]\displaystyle{ p }[/math] dostajemy

[math]\displaystyle{ 2 V_{p + 1} \equiv P^2 + D \cdot D^{(p - 1) / 2} \pmod{p} }[/math]


Z założenia [math]\displaystyle{ D }[/math] jest liczbą niekwadratową modulo [math]\displaystyle{ p }[/math], zatem [math]\displaystyle{ D^{(p - 1) / 2} \equiv - 1 \pmod{p} }[/math]. Skąd wynika natychmiast, że

[math]\displaystyle{ 2 V_{p + 1} \equiv P^2 - D \equiv 4 Q \pmod{p} }[/math]

Zatem

[math]\displaystyle{ V_{p + 1} \equiv 2 Q \pmod{p} }[/math]

Punkt 3.

Dla parzystego [math]\displaystyle{ n = p - 1 }[/math] otrzymujemy z twierdzenia N7

[math]\displaystyle{ 2^{p - 2} V_{p - 1} = P^{p - 1} + \binom{p - 1}{2} P^{p - 3} D + \binom{p - 1}{4} P^{p - 5} D^2 + \ldots + \binom{p - 1}{p - 3} P^2 D^{(p - 3) / 2} + D^{(p - 1) / 2} }[/math]

Ponieważ dla [math]\displaystyle{ k \in [0, p - 1] }[/math] jest (zobacz N45)

[math]\displaystyle{ \binom{p - 1}{k} \equiv (- 1)^k \pmod{p} }[/math]

to modulo [math]\displaystyle{ p }[/math] mamy

[math]\displaystyle{ 2^{p - 2} V_{p - 1} \equiv P^{p - 1} + P^{p - 3} D + P^{p - 5} D^2 + \ldots + P^2 D^{(p - 3) / 2} + D^{(p - 1) / 2} \pmod{p} }[/math]


Z założenia [math]\displaystyle{ D }[/math] jest liczbą kwadratową modulo [math]\displaystyle{ p }[/math], zatem istnieje taka liczba [math]\displaystyle{ R }[/math], że

[math]\displaystyle{ D \equiv R^2 \pmod{p} }[/math]

Ponieważ

  • [math]\displaystyle{ (D \mid p) = 1 }[/math], to [math]\displaystyle{ p \nmid D }[/math], zatem [math]\displaystyle{ p \nmid R }[/math]
  • z założenia [math]\displaystyle{ p \nmid Q }[/math], to [math]\displaystyle{ P^2 - R^2 \equiv P^2 - D \equiv 4 Q \not\equiv 0 \pmod{p} }[/math]


Czyli

[math]\displaystyle{ 2^{p - 2} V_{p - 1} \equiv P^{p - 1} + P^{p - 3} R^2 + P^{p - 5} R^4 + \ldots + P^2 R^{p - 3} + R^{p - 1} \pmod{p} }[/math]


Uwzględniając, że [math]\displaystyle{ P^2 - R^2 \not\equiv 0 \pmod{p} }[/math], możemy napisać

[math]\displaystyle{ 2^{p - 2} (P^2 - R^2) V_{p - 1} \equiv (P^2 - R^2) (P^{p - 1} + P^{p - 3} R^2 + P^{p - 5} R^4 + \ldots + P^2 R^{p - 3} + R^{p - 1}) \pmod{p} }[/math]
[math]\displaystyle{ \equiv P^{p + 1} - R^{p + 1} \pmod{p} }[/math]
[math]\displaystyle{ \equiv P^2 - R^2 \pmod{p} }[/math]

Zatem

[math]\displaystyle{ 2^{p - 2} V_{p - 1} \equiv 1 \pmod{p} }[/math]

Skąd wynika

[math]\displaystyle{ V_{p - 1} \equiv 2 \pmod{p} }[/math]

Co należało pokazać.


Aby zapisać punkty 2. i 3. twierdzenia P3 (i tylko te punkty) w zwartej formie, musimy założyć, że [math]\displaystyle{ \gcd (p, D) = 1 }[/math]. Otrzymujemy
Twierdzenie P4
Jeżeli [math]\displaystyle{ p }[/math] jest liczbą pierwszą nieparzystą i [math]\displaystyle{ \gcd (p, Q D) = 1 }[/math], to

[math]\displaystyle{ V_{p - (D \mid p)} \equiv 2 Q^{(1 - (D \mid p)) / 2} \pmod{p} }[/math]



Liczby pseudopierwsze Dicksona drugiego rodzaju

Uwaga P5
Z twierdzenia P4 wiemy, że dla liczb pierwszych nieparzystych takich, że [math]\displaystyle{ p \nmid Q D }[/math] jest

[math]\displaystyle{ V_{p - (D \mid p)} \equiv 2 Q^{(1 - (D \mid p)) / 2} \pmod{p} }[/math]

gdzie [math]\displaystyle{ (D \mid p) }[/math] oznacza symbol Legendre'a. Jeśli zastąpimy symbol Legendre'a symbolem Jacobiego, to będziemy mogli badać prawdziwość tego twierdzenia dla liczb złożonych i łatwo przekonamy się, że dla pewnych liczb złożonych [math]\displaystyle{ m }[/math] kongruencja

[math]\displaystyle{ V_{m - (D \mid m)} \equiv 2 Q^{(1 - (D \mid m)) / 2} \pmod{m} }[/math]

również jest prawdziwa. Prowadzi to definicji liczb pseudopierwszych Dicksona drugiego rodzaju[1][2].


Definicja P6
Powiemy, że liczba złożona nieparzysta [math]\displaystyle{ m }[/math] jest liczbą pseudopierwszą Dicksona drugiego rodzaju dla parametrów [math]\displaystyle{ P }[/math] i [math]\displaystyle{ Q }[/math][3] (D2PSP([math]\displaystyle{ P, Q }[/math])), jeżeli [math]\displaystyle{ \gcd (m, Q D) = 1 }[/math] i

[math]\displaystyle{ V_{m - (D \mid m)} \equiv 2 Q^{(1 - (D \mid m)) / 2} \pmod{m} }[/math]

gdzie [math]\displaystyle{ (D \mid m) }[/math] oznacza symbol Jacobiego.


Uwaga P7
Wykorzystując funkcje jacobi(a, n) i modLucas(n, P, Q, m) (zobacz J47, N15) możemy napisać prosty program do testowania pierwszości liczb na podstawie twierdzenia P4.

isPrimeOrD2PSP(m, P, Q) = 
{
local(D, js);
D = P^2 - 4*Q;
if( gcd(m, 2*Q*D) > 1, return(0) );
js = jacobi(D, m);
if( modLucas(m - js, P, Q, m)[2] == ( 2*Q^((1 - js)/2) ) % m, return(1), return(0) );
}


Przykład P8
Poniższa tabela zawiera najmniejsze liczby pseudopierwsze Dicksona drugiego rodzaju dla różnych parametrów [math]\displaystyle{ P }[/math] i [math]\displaystyle{ Q }[/math].

Pokaż kod
FirstD2PSP(Stop) = 
\\ najmniejsze D2PSP(P,Q) < Stop;  dla 1<=P<=10 i -5<=Q<=5
{
local(D, m, P, Q);
Q = -6;
while( Q++ <= 5,
       if( Q == 0, next() );
       P = 0;
       while( P++ <= 10,
              D = P^2 - 4*Q;
              if( D == 0, 
                  print("Q= ", Q, "   P= ", P, "   ------------------");
                  next();
                );
              m = 3;
              while( m < Stop,
                     if( isPrimeOrD2PSP(m, P, Q)  &&  !isprime(m),
                         print("Q= ", Q, "   P= ", P, "   m= ", m, "   (D|m)= ", jacobi(D, m));
                         break();
                       );
                     m = m + 2;
                   );
            );
     );
}


Żółtym tłem oznaczyliśmy te najmniejsze liczby pseudopierwsze Lucasa, dla których [math]\displaystyle{ (D \mid m) = - 1 }[/math].


Przykład P9
Tabela przedstawia ilość liczb D2PSP([math]\displaystyle{ P, Q }[/math]) mniejszych od [math]\displaystyle{ 10^9 }[/math].

Pokaż kod
NumOfD2PSP(Stop) = 
\\ ilość liczb pseudopierwszych Dicksona drugiego rodzaju D2PSP(P,Q) < Stop;  dla 1<=P<=10 i -5<=Q<=5
{
local(D, m, P, Q);
Q = -6;
while( Q++ <= 5,
       if( Q == 0, next() );
       P = 0;
       while( P++ <= 10,
              D = P^2 - 4*Q;
              if( D == 0, print("Q= ", Q, "   P= ", P, "   ------------------"); next() );
              s = 0;
              m = 3;
              while( m < Stop,
                     if( isPrimeOrD2PSP(m, P, Q)  &&  !isprime(m), s++ );
                     m = m + 2;
                   );
              print("Q= ", Q, "   P= ", P, "   s= ", s);
            );
     );
}



Przykład P10
Tabele przedstawiają ilość liczb D2PSP( [math]\displaystyle{ 1, Q }[/math] ) mniejszych od [math]\displaystyle{ 10^9 }[/math] dla [math]\displaystyle{ | Q | \leqslant 20 }[/math].


Zauważmy, że otrzymane wartości dla [math]\displaystyle{ Q = \pm 1 }[/math] i [math]\displaystyle{ Q = - 2 }[/math] są wyraźnie większe od pozostałych.



Zmodyfikowana metoda Selfridge'a wyboru parametrów [math]\displaystyle{ P }[/math] i [math]\displaystyle{ Q }[/math]

Uwaga P11
Przykłady P9 i P10 pokazują, że w przypadku liczb pseudopierwszych Dicksona drugiego rodzaju dla parametrów [math]\displaystyle{ P, Q }[/math] należy unikać wyboru [math]\displaystyle{ Q = \pm 1 }[/math] i [math]\displaystyle{ Q = - 2 }[/math]. Niestety, metoda Selfridge'a dopuszcza wartość [math]\displaystyle{ Q = - 1 }[/math]. Baillie i Wagstaff[4] dostrzegają ten problem (zobacz tabelę nr 4 na stronie 1407) i „naprawiają” metodę Selfridge'a wprowadzając następującą poprawkę: jeśli otrzymamy parę [math]\displaystyle{ (P, Q) = (1, -1) }[/math], to należy zamienić ją na parę [math]\displaystyle{ (P, Q) = (5, 5) }[/math]. Ponieważ liczba nieparzysta [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 1, - 1 }[/math]) / SLPSP([math]\displaystyle{ 1, - 1 }[/math]) wtedy i tylko wtedy, gdy [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 5, 5 }[/math]) / SLPSP([math]\displaystyle{ 5, 5 }[/math]) (zobacz P18 i P19), to taka poprawka nie zmienia wyników wcześniejszych obliczeń wykorzystujących funkcje LucasTest(m) i StrongLucasTest(m).

Innym sposobem usunięcia przypadku [math]\displaystyle{ Q = - 1 }[/math] jest wyszukiwanie liczby [math]\displaystyle{ a_k }[/math], dla której [math]\displaystyle{ (a_k \mid m) = - 1 }[/math] od [math]\displaystyle{ a_k \gt 5 }[/math]. To oznacza zmianę metody i oczywiście zmieni wyniki wcześniejszych obliczeń funkcji LucasTest(m) i StrongLucasTest(m).

Dlatego konieczne było napisanie nowej funkcji MethodA(m). Działa ona teraz w ten sposób, że domyślnie (bez podania drugiego parametru lub wpisując jako drugi parametr wartość "*") działa ona jak „poprawiona” metoda Selfridge'a (następuje zamiana pary [math]\displaystyle{ (P, Q) = (1, - 1) }[/math] na [math]\displaystyle{ (P, Q) = (5, 5) }[/math]). Jeżeli wpiszemy drugi parametr, to będzie on interpretowany, jako wyraz ciągu [math]\displaystyle{ a_k = (- 1)^k (2 k + 1) }[/math], od którego należy rozpocząć przeszukiwanie. Parametr musi być elementem ciągu [math]\displaystyle{ (a_k) }[/math] dla [math]\displaystyle{ k \geqslant 2 }[/math]. Przykładowo MethodA(m, 5), to stara (niepoprawiona) wersja funkcji, MethodA(m, -7) rozpocznie poszukiwanie liczby [math]\displaystyle{ a_k }[/math] takiej, że [math]\displaystyle{ (a_k \mid m) = - 1 }[/math] od [math]\displaystyle{ a_k = - 7 }[/math].

MethodA(m, start = "*") = 
{
\\ parametr start (poza "*") musi być wyrazem ciągu a_k = (-1)^k * (2*k+1) dla k >= 2
local(a, js, Q);
if( m%2 == 0, return("Error") );
if( m == 1, return([0, 0]) ); \\ 1 nie jest liczbą pierwszą
a = if( start == "*", 5, start );
if( a%4 <> 1, return("Error") );
a = -a + 2*sign(a); \\ poprzedni wyraz ciągu (a_k)
while( 1,
       a = -a - 2*sign(a); \\ następny wyraz ciągu (a_k)
       js = jacobi(a, m);
       if( js == 1, next() );
       if( js == 0, if( (a % m) <> 0, return([0, 0]), next() ) );
       if( js == -1, Q = (1 - a)/4 );
       if( start == "*" && Q == -1, return([5, 5]) );
       if( gcd(Q, m) == 1, return([1, Q]) );
       if( Q % m <> 0, return([0, 0]) ); \\ gcd(Q, m) > 1
     );
}

Jeżeli [math]\displaystyle{ \gcd (a, m) \gt 0 }[/math] lub [math]\displaystyle{ \gcd (Q, m) \gt 0 }[/math], to następuje sprawdzenie złożoności liczby [math]\displaystyle{ m }[/math] (linia czwarta i ósma pętli while). Jeśli nie została wykryta złożoność liczby [math]\displaystyle{ m }[/math], to funkcja MethodA() zwraca parę [math]\displaystyle{ (P, Q) }[/math] taką, że [math]\displaystyle{ \gcd (m, Q D) = 1 }[/math], gdzie [math]\displaystyle{ D = P^2 - 4 Q }[/math].


Zadanie P12
Pokazać, że dla dowolnej niekwadratowej liczby nieparzystej [math]\displaystyle{ m }[/math] jest: MethodA(m, 9) = MethodA(m, -11).

Rozwiązanie

Mówiąc o liniach kodu, mamy na myśli linie w pętli while. Linia nr 1 w pętli while, to linia a = -a - 2*sign(a);.

Możemy znacznie ułatwić sobie analizę problemu, sprawdzając, że równość MethodA(m, 9) = MethodA(m, -11) jest prawdziwa dla niekwadratowych liczb nieparzystych mniejszych od [math]\displaystyle{ 100 }[/math]. Wystarczy wykonać prosty test:

forstep(m=1, 10^2, 2, if( issquare(m), next() ); if( MethodA(m, 9) <> MethodA(m, -11), print(m) ))


Dalszą analizę możemy przeprowadzić dla liczb [math]\displaystyle{ m }[/math] postaci [math]\displaystyle{ 6 k + 1 }[/math], [math]\displaystyle{ 6 k + 3 }[/math], [math]\displaystyle{ 6 k + 5 }[/math], gdzie [math]\displaystyle{ k \geqslant 10 }[/math]. Rozważmy działanie funkcji MethodA(m, 9).


Jeżeli [math]\displaystyle{ m = 6 k + 1 }[/math] lub [math]\displaystyle{ m = 6 k + 5 }[/math], to [math]\displaystyle{ (9 \mid m) = (3 \mid m)^2 = 1 }[/math] i wykonywana jest linia nr 3, w wyniku czego następuje przejście do kolejnej wartości a, która jest równa [math]\displaystyle{ - 11 }[/math]. Od tej chwili nie ma już różnic między MethodA(m, 9) i MethodA(m, -11).

Jeżeli [math]\displaystyle{ m = 6 k + 3 }[/math], to [math]\displaystyle{ (9 \mid m) = 0 }[/math] i wykonywana jest linia nr 4, w wyniku czego funkcja MethodA(m, 9) zwraca wektor [0, 0].


Pozostaje pokazać, że funkcja MethodA(m, -11) dla [math]\displaystyle{ m = 6 k + 3 }[/math], gdzie [math]\displaystyle{ k \geqslant 10 }[/math], również zwraca wektor [0, 0].


Jeżeli [math]\displaystyle{ (- 11 \mid 6 k + 3) = 0 }[/math], to wykonywana jest linia nr 4, w wyniku czego zwracany jest wektor [0, 0].

Jeżeli [math]\displaystyle{ (- 11 \mid 6 k + 3) = - 1 }[/math], to wykonywana jest linia nr 5, w wyniku czego wyliczana jest wartość Q i otrzymujemy [math]\displaystyle{ Q = 3 }[/math]. Ponieważ [math]\displaystyle{ \gcd (Q, m) = 3 \gt 1 }[/math], to po wykonaniu linii nr 8 (ostatnia linia) zwracany jest wektor [0, 0].

Jeżeli [math]\displaystyle{ (- 11 \mid 6 k + 3) = 1 }[/math], to wykonywana jest linia nr 3, w wyniku czego następuje przejście do kolejnej wartości a, która jest równa [math]\displaystyle{ 13 }[/math].


Jeżeli [math]\displaystyle{ (13 \mid 6 k + 3) = 0 }[/math], to wykonywana jest linia nr 4, w wyniku czego zwracany jest wektor [0, 0].

Jeżeli [math]\displaystyle{ (13 \mid 6 k + 3) = - 1 }[/math], to wykonywana jest linia nr 5, w wyniku czego wyliczana jest wartość Q i otrzymujemy [math]\displaystyle{ Q = - 3 }[/math]. Ponieważ [math]\displaystyle{ \gcd (Q, m) = 3 \gt 1 }[/math], to po wykonaniu linii nr 8 (ostatnia linia) zwracany jest wektor [0, 0].

Jeżeli [math]\displaystyle{ (13 \mid 6 k + 3) = 1 }[/math], to wykonywana jest linia nr 3, w wyniku czego następuje przejście do kolejnej wartości a, która jest równa [math]\displaystyle{ - 15 }[/math].


Ponieważ [math]\displaystyle{ (- 15 \mid 6 k + 3) = 0 }[/math], to wykonywana jest linia nr 4, w wyniku czego zwracany jest wektor [0, 0].


Pokazaliśmy, że funkcje MethodA(m, 9) i MethodA(m, -11) zwracają takie same wartości dla wszystkich niekwadratowych liczb nieparzystych [math]\displaystyle{ m }[/math].


Uwaga P13
Podobnie, jak w przypadku liczb pseudopierwszych Lucasa LPSP([math]\displaystyle{ P, Q }[/math]) i w przypadku liczb silnie pseudopierwszych Lucasa SLPSP([math]\displaystyle{ P, Q }[/math]), tak i w przypadku liczb pseudopierwszych Dicksona drugiego rodzaju D2PSP([math]\displaystyle{ P, Q }[/math]) możemy testować pierwszość liczby [math]\displaystyle{ m }[/math], wybierając liczby [math]\displaystyle{ P, Q }[/math] losowo lub zastosować wybraną metodę postępowania. Przyjmując zmodyfikowaną postać funkcji MethodA(), możemy łatwo napisać program:

Dickson2Test(m) =
{
local(P, Q, X);
if( m%2 == 0, return(m == 2) );
if( issquare(m), return(0) ); \\ sprawdzamy, czy m nie jest liczbą kwadratową
X = MethodA(m);
P = X[1];
Q = X[2];
if( P == 0, return(0) ); \\ jeżeli P = 0, to m jest liczbą złożoną
if( modLucas(m + 1, P, Q, m)[2] == (2*Q) % m, return(1), return(0) );
}


Przykład P14
Poniżej przedstawiamy najmniejsze liczby D2PSP([math]\displaystyle{ P, Q }[/math]) oraz ilości tych liczb w zależności od wartości parametru start w funkcji MethodA(m, start). Ponieważ MethodA(m, 9) = MethodA(m, -11) (zobacz P12), to pominęliśmy przypadek MethodA(m, -11). Dla porównania w następnym przykładzie przedstawimy analogiczne zestawienia dla liczb SLPSP([math]\displaystyle{ P, Q }[/math]).


Ilość liczb pseudopierwszych Dicksona drugiego rodzaju mniejszych od [math]\displaystyle{ 10^n }[/math] dla różnych parametrów start funkcji MethodA().


Najmniejsze liczby pseudopierwsze Dicksona drugiego rodzaju dla różnych parametrów start funkcji MethodA(). Pogrubioną czcionką zostały zaznaczone te liczby, które są jednocześnie silnie pseudopierwszymi liczbami Lucasa (dla tego samego parametru start).


Liczby w pierwszym wierszu są tak duże, że możemy co najwyżej zweryfikować, czy są D2PSP([math]\displaystyle{ P, Q }[/math])

X = [913, 150267335403, 430558874533, 14760229232131, 936916995253453]
for(k = 1, length(X), print( Dickson2Test(X[k]) ))

Równie łatwo sprawdzamy, że

Dickson2Test(14760229232131, 5) == 1
Dickson2Test(14760229232131, -7) == 1


Czytelnik zapewne zwrócił uwagę na liczbę [math]\displaystyle{ m = 101378999149 = 43 \cdot 73 \cdot 109 \cdot 296299 }[/math], która pojawia się aż w ośmiu kolejnych wierszach. Kiedy i dlaczego taka sytuacja ma miejsce?

Jest tak wtedy, gdy dla [math]\displaystyle{ r }[/math] kolejnych liczb [math]\displaystyle{ a_k }[/math], gdzie [math]\displaystyle{ a_k = (- 1)^k (2 k + 1) }[/math] mamy

[math]\displaystyle{ (a_k \mid m) = (a_{k + 1} \mid m) = \ldots = (a_{k + r - 1} \mid m) = 1 }[/math]

oraz

[math]\displaystyle{ (a_{k + r} \mid m) = - 1 }[/math]

a ponadto liczba [math]\displaystyle{ m }[/math] jest liczbą pseudopierwszą Dicksona drugiego rodzaju dla parametrów [math]\displaystyle{ P, Q }[/math] wyliczonych przy pomocy funkcji MethodA() z liczby [math]\displaystyle{ a_{k + r} }[/math], czyli [math]\displaystyle{ P = 1 }[/math], [math]\displaystyle{ Q = (1 - a_{k + r}) / 4 }[/math].

Ponieważ w pętli while funkcji MethodA() mamy następujące linie

a = -a - 2*sign(a); \\ następny wyraz ciągu (a_k)
js = jacobi(a, m);
if( js == 1, next() );

to dla wszystkich liczb [math]\displaystyle{ a_j }[/math], gdzie [math]\displaystyle{ k \leqslant j \leqslant k + r - 1 }[/math] następuje przejście do liczby [math]\displaystyle{ a_{j + 1} }[/math], aż do osiągnięcia wartości [math]\displaystyle{ a_{k + r} }[/math].



Silnie pseudopierwsze liczby Lucasa i zmodyfikowana metoda Selfridge'a

Przykład P15
Poniżej przedstawiamy najmniejsze liczby SLPSP([math]\displaystyle{ P, Q }[/math]) oraz ilości tych liczb w zależności od wartości parametru start w funkcji MethodA(m, start). Ponieważ MethodA(m, 9) = MethodA(m, -11) (zobacz P12), to pominęliśmy przypadek MethodA(m, -11).


Ilość silnie pseudopierwszych liczb Lucasa mniejszych od [math]\displaystyle{ 10^n }[/math] dla różnych parametrów start funkcji MethodA().


Najmniejsze silnie pseudopierwsze liczby Lucasa dla różnych parametrów start funkcji MethodA(). Pogrubioną czcionką zostały zaznaczone te liczby, które są jednocześnie pseudopierwszymi liczbami Dicksona drugiego rodzaju (dla tego samego parametru start).


Uwaga P16
Przyglądając się wierszom drugiej tabeli z przykładu P15, łatwo zauważamy, że w wierszach położonych blisko siebie często występują te same liczby. Zbadamy teraz, ile jest wspólnych liczb między poszczególnymi wierszami.

Pokazana niżej tabela powstała po znalezienia wszystkich liczb SLPSP(m, a), gdzie

[math]\displaystyle{ a \in \{ }[/math]"*"[math]\displaystyle{ , -7, 9, 13, -15, 17, -19, 21, -23, 25, -27, 29, -31, 33 \} }[/math]

i [math]\displaystyle{ m \lt 10^{10} }[/math]. Następnie policzyliśmy ilość liczb SLPSP wspólnych dla różnych parametrów [math]\displaystyle{ a }[/math].

Zauważamy, że im bardziej odległe są parametry a, to tym mniej pojawia się wspólnych liczb SLPSP.

Ten sam efekt występuje w przypadku liczb D2PSP. Choć dysponujemy w tym przypadku zaledwie 25 różnymi liczbami (nie uwzględniamy liczb wypisanych w drugim wierszu), to zdarza się, że powtarzają się one w sąsiadujących wierszach.

Wynika stąd praktyczny wniosek: jeśli chcemy przeprowadzić dwa testy SLPSP(m, a) dla różnych parametrów a, to powinny to być raczej SLPSP(m, "*") i SLPSP(m, 33), a nie np. SLPSP(m, "*") i SLPSP(m, -7).



Wzmocnienie testu BPSW

Uwaga P17
Dla wszystkich rozpatrywanych tutaj parametrów start takich, że

start [math]\displaystyle{ \in \{ }[/math]"*"[math]\displaystyle{ , -7, 9, 13, -15, 17, -19, 21, -23, 25, -27, 29, -31, 33 \} }[/math]

(czyli poza przypadkiem niezmodyfikowanej metody Selfridge'a – funkcja MethodA(m, 5)) znaleźliśmy [math]\displaystyle{ 25 }[/math] liczb pseudopierwszych Dicksona drugiego rodzaju. Większość z nich to liczby mniejsze od [math]\displaystyle{ 10^{10} }[/math] (zobacz P14). Żadna z tych liczb nie jest silnie pseudopierwszą liczbą Lucasa (SLPSP) i nie zależy to od wyboru wartości parametru start w funkcji StrongLucasTest(m, start) (również dla start = 5).

Przypomnijmy, że nie znamy liczb nieparzystych [math]\displaystyle{ m }[/math], które byłyby jednocześnie liczbami silnie pseudopierwszymi (SPSP) i silnie pseudopierwszymi liczbami Lucasa (SLPSP) dla [math]\displaystyle{ m \lt 2^{64} }[/math]. Jest bardzo prawdopodobne, że równie rzadko występują liczby, które są jednocześnie silnie pseudopierwszymi liczbami Lucasa (SLPSP) i pseudopierwszymi liczbami Dicksona drugiego rodzaju (D2PSP). Stanowi to dobrą przesłankę do wzmocnienia testu BPSW.


Zatem wykorzystując funkcję Dickson2Test(m), możemy otrzymać test znacznie silniejszy od testu BPSW.

BPSW2test(m) =
{
local(p);
forprime(p = 2, 1000, if( m % p > 0, next() ); if( m == p, return(1), return(0) ));
if( !isPrimeOrSPSP(m, 2), return(0) );
if( !StrongLucasTest(m), return(0) );
if( !Dickson2Test(m), return(0), return(1) );
}


Oczywiście możemy (a nawet powinniśmy), napisać program, w którym połączymy testy StrongLucasTest(m) i Dickson2Test(m).

StrongLucasAndDickson2Test(m) =
{
local(a, b, c, k, P, Q, r, SLT, w, X);
if( m%2 == 0, return(m == 2) );
if( issquare(m), return(0) ); \\ sprawdzamy, czy liczba m nie jest kwadratowa
X = MethodA(m);
P = X[1];
Q = X[2];
if( P == 0, return(0) ); \\ jeżeli P = 0, to m jest liczbą złożoną
r = valuation(m + 1, 2); \\ znajdujemy wykładnik, z jakim liczba 2 występuje w m + 1
w = (m + 1) / 2^r;
X =  modLucas(w, P, Q, m);
a = X[1]; \\ U_w(P, Q) % m
b = X[2]; \\ V_w(P, Q) % m
SLT = 0;
if( a == 0 || b == 0, SLT = 1 ); \\ b == 0 to przypadek k == 0
c = modPower(Q, w, m); \\ Q^w % m
k = 0;
\\ sprawdzamy warunek V_(2^k * w) %m = 0; korzystamy ze wzoru V_(2*w) = (V_w)^2 - 2*Q^w
while( k++ < r,
       b = (b^2 - 2*c) % m;
       if( SLT == 0  &&  b == 0, SLT = 1 );
       c = c^2 % m;
     );
if( SLT == 0, return(0) ); \\ liczba m nie przeszła silnego testu Lucasa
b = (b^2 - 2*c) % m; \\ V_(m+1)(P, Q) % m
if( b == (2*Q) % m, return(1), return(0) );
}


Zauważmy, że po takim połączeniu czas obliczeń w przypadku testu BPSW2(m) nie ulega praktycznie wydłużeniu w stosunku do testu BPSW(m), bo funkcja modLucas() wylicza jednocześnie liczby [math]\displaystyle{ U_m (P, Q) }[/math] i [math]\displaystyle{ V_m (P, Q) }[/math] modulo [math]\displaystyle{ n }[/math]. Uzyskaliśmy w ten sposób bardzo silne narzędzie do badania pierwszości liczb:

BPSW2test(m) =
{
local(p);
forprime(p = 2, 1000, if( m % p > 0, next() ); if( m == p, return(1), return(0) ));
if( !isPrimeOrSPSP(m, 2), return(0) );
if( !StrongLucasAndDickson2Test(m), return(0), return(1) );
}



Uzupełnienie

Dowody twierdzeń P18 i P19 zostały oparte na pomyśle przedstawionym przez Bailliego, Fioriego i Wagstaffa[5].
Twierdzenie P18
Liczba nieparzysta [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 1, - 1 }[/math]) wtedy i tylko wtedy, gdy [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 5, 5 }[/math]).

Dowód

W zadaniu N12 połóżmy [math]\displaystyle{ Q = 1 }[/math] i konsekwentnie [math]\displaystyle{ P = 4 Q + 1 = 5 }[/math]. Pierwszy z wypisanych wzorów przyjmie postać

[math]\displaystyle{ U_{2 k} (5, 5) = 5^k U_{2 k} (1, - 1) }[/math]

Z założenia [math]\displaystyle{ m }[/math] jest liczbą nieparzystą, zatem dla parzystej liczby [math]\displaystyle{ m - \epsilon }[/math], gdzie [math]\displaystyle{ \epsilon = (D \mid m) = \pm 1 }[/math] jest

[math]\displaystyle{ U_{m - \epsilon} (5, 5) = 5^{(m - \epsilon) / 2} U_{m - \epsilon} (1, - 1) }[/math]

Zauważmy, że

  • dla [math]\displaystyle{ (P, Q) = (1, - 1) \;\; \text{i} \;\; (P, Q) = (5, 5) }[/math] jest [math]\displaystyle{ D = P^2 - 4 Q = 5 }[/math]
  • [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] wtedy i tylko wtedy, gdy [math]\displaystyle{ \gcd (m, 25) = 1 }[/math]
  • [math]\displaystyle{ U_{m - \epsilon} (5, 5) \equiv 5^{(m - \epsilon) / 2} U_{m - \epsilon} (1, - 1) \pmod{m} }[/math]

[math]\displaystyle{ \Large{\Longrightarrow} }[/math]

Jeżeli [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 1, - 1 }[/math]), to [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] i [math]\displaystyle{ U_{m - \epsilon} (1, - 1) \equiv 0 \pmod{m} }[/math], zatem [math]\displaystyle{ \gcd (m, 25) = 1 }[/math] i [math]\displaystyle{ U_{m - \epsilon} (5, 5) \equiv 0 \pmod{m} }[/math]. Czyli [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 5, 5 }[/math]).

[math]\displaystyle{ \Large{\Longleftarrow} }[/math]

Jeżeli [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 5, 5 }[/math]), to [math]\displaystyle{ \gcd (m, 25) = 1 }[/math] i [math]\displaystyle{ U_{m - \epsilon} (5, 5) \equiv 0 \pmod{m} }[/math], zatem [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] i

[math]\displaystyle{ 5^{(m - \epsilon) / 2} U_{m - \epsilon} (1, - 1) \equiv 0 \pmod{m} }[/math]

Ponieważ [math]\displaystyle{ \gcd (m, 5) = 1 }[/math], to z powyższej kongruencji wynika natychmiast, że (zobacz C74)

[math]\displaystyle{ U_{m - \epsilon} (1, - 1) \equiv 0 \pmod{m} }[/math]

Czyli [math]\displaystyle{ m }[/math] jest LPSP([math]\displaystyle{ 1, - 1 }[/math]). Co należało pokazać.


Twierdzenie P19
Liczba nieparzysta [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 1, - 1 }[/math]) wtedy i tylko wtedy, gdy [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 5, 5 }[/math]).

Dowód

W zadaniu N12 połóżmy [math]\displaystyle{ Q = 1 }[/math] i konsekwentnie [math]\displaystyle{ P = 4 Q + 1 = 5 }[/math]. Drugi, czwarty i trzeci z wypisanych wzorów przyjmą postać

[math]\displaystyle{ U_{2 k + 1} (5, 5) = 5^k V_{2 k + 1} (1, - 1) }[/math]
[math]\displaystyle{ V_{2 k + 1} (5, 5) = 5^{k + 1} U_{2 k + 1} (1, - 1) }[/math]
[math]\displaystyle{ V_{2 k} (5, 5) = 5^k V_{2 k} (1, - 1) }[/math]


Niech [math]\displaystyle{ m - (D \mid m) = 2^r w }[/math], gdzie [math]\displaystyle{ w }[/math] jest liczbą nieparzystą. Uwzględniając wypisane wyżej wzory, zauważmy, że

  • dla [math]\displaystyle{ (P, Q) = (1, - 1) \;\; \text{i} \;\; (P, Q) = (5, 5) }[/math] jest [math]\displaystyle{ D = P^2 - 4 Q = 5 }[/math]
  • [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] wtedy i tylko wtedy, gdy [math]\displaystyle{ \gcd (m, 25) = 1 }[/math]
  • [math]\displaystyle{ U_w (5, 5) \equiv 5^{(w - 1) / 2} V_w (1, - 1) \pmod{m} }[/math]
  • [math]\displaystyle{ V_w (5, 5) \equiv 5^{(w + 1) / 2} U_w (1, - 1) \pmod{m} }[/math]
  • [math]\displaystyle{ V_{2^j w} (5, 5) \equiv 5^{2^{j - 1} w} V_{2^j w} (1, - 1) \pmod{m} \qquad }[/math] gdzie [math]\displaystyle{ j \geqslant 1 }[/math]


Liczba [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 1, - 1 }[/math]) jeżeli [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] i zachodzi dokładnie jeden z warunków

A) [math]\displaystyle{ \; U_w (1, - 1) \equiv 0 \pmod{m} }[/math]
B) [math]\displaystyle{ \; V_w (1, - 1) \equiv 0 \pmod{m} }[/math]
C) [math]\displaystyle{ \; V_{2^j w} (1, - 1) \equiv 0 \pmod{m} \qquad }[/math] dla pewnego [math]\displaystyle{ j \in [1, r - 1] }[/math] (w przypadku, gdy [math]\displaystyle{ r \geqslant 2 }[/math])


Podobnie, liczba [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 5, 5 }[/math]) jeżeli [math]\displaystyle{ \gcd (m, 25) = 1 }[/math] i zachodzi dokładnie jeden z warunków

a) [math]\displaystyle{ \; U_w (5, 5) \equiv 0 \pmod{m} }[/math]
b) [math]\displaystyle{ \; V_w (5, 5) \equiv 0 \pmod{m} }[/math]
c) [math]\displaystyle{ \; V_{2^j w} (5, 5) \equiv 0 \pmod{m} \qquad }[/math] dla pewnego [math]\displaystyle{ j \in [1, r - 1] }[/math] (w przypadku, gdy [math]\displaystyle{ r \geqslant 2 }[/math])

[math]\displaystyle{ \Large{\Longrightarrow} }[/math]

Jeżeli [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 1, - 1 }[/math]), to [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] i zachodzi dokładnie jeden z warunków A), B), C). Zatem [math]\displaystyle{ \gcd (m, 25) = 1 }[/math] i zachodzi dokładnie jeden z warunków a), b), c). Czyli [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 5, 5 }[/math]).

[math]\displaystyle{ \Large{\Longleftarrow} }[/math]

Jeżeli [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 5, 5 }[/math]), to [math]\displaystyle{ \gcd (m, 25) = 1 }[/math] i zachodzi dokładnie jeden z warunków a), b), c). Zatem [math]\displaystyle{ \gcd (m, - 5) = 1 }[/math] i zachodzi dokładnie jedna z kongruencji

[math]\displaystyle{ 5^{(w - 1) / 2} V_w (1, - 1) \equiv 0 \pmod{m} }[/math]
[math]\displaystyle{ 5^{(w + 1) / 2} U_w (1, - 1) \equiv 0 \pmod{m} }[/math]
[math]\displaystyle{ 5^{2^{j - 1} w} V_{2^j w} (1, - 1) \equiv 0 \pmod{m} }[/math]

Ponieważ [math]\displaystyle{ \gcd (m, 5) = 1 }[/math], to z powyższych wzorów wynika natychmiast, że zachodzi dokładnie jedna z kongruencji (zobacz C74)

[math]\displaystyle{ V_w (1, - 1) \equiv 0 \pmod{m} }[/math]
[math]\displaystyle{ U_w (1, - 1) \equiv 0 \pmod{m} }[/math]
[math]\displaystyle{ V_{2^j w} (1, - 1) \equiv 0 \pmod{m} }[/math]

Co oznacza, że zachodzi dokładnie jeden z warunków A), B), C). Czyli [math]\displaystyle{ m }[/math] jest SLPSP([math]\displaystyle{ 1, - 1 }[/math]). Co należało pokazać.



Zestawienie funkcji

Uwaga P20
Poniżej przedstawiamy zestawienie najważniejszych funkcji, które wykorzystywaliśmy do testowania pierwszości liczb. Zauważmy, że wprowadziliśmy drugi parametr do funkcji, które wywołują funkcję MethodA() tak, aby możliwe było pełne wykorzystanie tej funkcji po zmodyfikowaniu i związane z tym poprawki.

\\ potęgowanie modulo
modPower(a, n, m) = 
\\ a - podstawa, n - wykładnik, m - moduł
{
local(w);
if( m == 1, return(0) );
a = a % m;
w = 1;
while( n > 0,
       if( n % 2 == 1, w = (w * a) % m; n = n - 1); \\ gdy n jest nieparzyste, wyłączamy a i zmniejszamy n o jeden
       a = (a*a) % m; \\ wyliczamy nową podstawę modulo m
       n = n/2; \\ dla nowej podstawy wykładnik jest dwa razy mniejszy
     );
return(w);
}


\\ test Millera-Rabina
isPrimeOrSPSP(m, a) =
{
local(d, k, r, x);
if( m % 2 == 0, return(m == 2) );
r = valuation(m - 1, 2); \\ wykładnik, z jakim liczba 2 występuje w rozwinięciu na czynniki pierwsze liczby m - 1
d = (m - 1) / 2^r;
x = modPower(a, d, m);
if( x == 1 || x == m - 1, return(1) ); \\ x = m - 1 to przypadek k == 0
k = 0;
while( k++ < r,
       x = x^2 % m;
       if( x == m - 1, return(1) );
     );
return(0);
}


\\ obliczanie symbolu Jacobiego
jacobi(a, n) = 
{
local(r, w);
if( n <= 0 || n % 2 == 0, return("Error") );
a = a % n; \\ korzystamy ze wzoru (a|n) = (b|n), gdy a ≡ b (mod n)
w = 1;
while( a <> 0,
       while( a % 2 == 0, a = a/2; r = n % 8; if( r == 3 || r == 5, w = -w ) );
       \\ usunęliśmy czynnik 2 ze zmiennej a, uwzględniając, że (2|n) = -1, gdy n ≡ 3,5 (mod 8)
       \\ teraz zmienne a oraz n są nieparzyste
       r = a; \\ zmienna r tylko przechowuje wartość a
       a = n;
       n = r;
       if( a % 4 == 3 && n % 4 == 3, w = -w );
       \\ zamieniliśmy zmienne, uwzględniając, że (a|n) = - (n|a), gdy a ≡ n ≡ 3 (mod 4)
       a = a % n;
     );
if( n == 1, return(w), return(0) ); \\ n jest teraz równe gcd(a, n)
}


\\ obliczanie wyrazów ciągu Lucasa modulo m
modLucas(n, P, Q, m) =
{
local(A, i, s, U, U2, V, W, W2);
if( m == 1, return([0, 0]) );
if( n == 0, return([0, 2 % m]) );
A = digits(n, 2); \\ otrzymujemy wektor cyfr liczby n w układzie dwójkowym
s = length(A); \\ długość wektora A
U = 1;
W = P;
i = 1;
while( i++ <= s,
       if( A[i] == 0,  U2 = 2*U*W - P*U^2;  W2 = W^2 - Q*U^2 );
       if( A[i] == 1,  U2 = W^2 - Q*U^2;  W2 = P*W^2 - 2*Q*U*W );
       U = U2 % m;
       W = W2 % m;
     );
V = (2*W - P*U) % m;
return([U, V]);
}


\\ zmodyfikowana metoda Selfridge'a wyboru parametrów P i Q
MethodA(m, start = "*") = 
{
\\ parametr start (poza "*") musi być wyrazem ciągu a_k = (-1)^k * (2*k+1) dla k >= 2
local(a, js, Q);
if( m%2 == 0, return("Error") );
if( m == 1, return([0, 0]) ); \\ 1 nie jest liczbą pierwszą
a = if( start == "*", 5, start );
if( a%4 <> 1, return("Error") );
a = -a + 2*sign(a); \\ poprzedni wyraz ciągu (a_k)
while( 1,
       a = -a - 2*sign(a); \\ następny wyraz ciągu (a_k)
       js = jacobi(a, m);
       if( js == 1, next() );
       if( js == 0, if( (a % m) <> 0, return([0, 0]), next() ) );
       if( js == -1, Q = (1 - a)/4 );
       if( start == "*" && Q == -1, return([5, 5]) );
       if( gcd(Q, m) == 1, return([1, Q]) );
       if( Q % m <> 0, return([0, 0]) ); \\ gcd(Q, m) > 1
     );
}


\\ test Lucasa
LucasTest(m, start = "*") =
{
local(P, Q, X);
if( m % 2 == 0, return(m == 2) );
if( issquare(m), return(0) ); \\ sprawdzamy, czy m nie jest liczbą kwadratową
X = MethodA(m, start);
P = X[1];
Q = X[2];
if( P == 0, return(0) ); \\ jeżeli P = 0, to m jest liczbą złożoną
if( modLucas(m + 1, P, Q, m)[1] == 0, return(1), return(0) );
}


\\ silny test Lucasa
StrongLucasTest(m, start = "*") =
{
local(a, b, c, k, P, Q, r, w, X);
if( m%2 == 0, return(m == 2) );
if( issquare(m), return(0) ); \\ sprawdzamy, czy liczba m nie jest kwadratowa
X = MethodA(m, start);
P = X[1];
Q = X[2];
if( P == 0, return(0) ); \\ jeżeli P = 0, to m jest liczbą złożoną
r = valuation(m + 1, 2); \\ znajdujemy wykładnik, z jakim liczba 2 występuje w m + 1
w = (m + 1) / 2^r;
X =  modLucas(w, P, Q, m);
a = X[1]; \\ U_w(P, Q) % m
b = X[2]; \\ V_w(P, Q) % m
if( a == 0 || b == 0, return(1) ); \\ b == 0 to przypadek k == 0
if( r == 1, return(0) ); \\ nie ma dalszych przypadków
c = modPower(Q, w, m); \\ Q^w % m
k = 0;
\\ sprawdzamy warunek V_(2^k * w) %m = 0; korzystamy ze wzoru V_(2*w) = (V_w)^2 - 2*Q^w
while( k++ < r,
       b = (b^2 - 2*c) % m;
       if( b == 0, return(1) );
       c = c^2 % m;
     );
return(0);
}


\\ test BPSW
BPSWtest(m, start = "*") =
{
forprime(p = 2, 1000, if( m % p > 0, next() ); if( m == p, return(1), return(0) ));
if( !isPrimeOrSPSP(m, 2), return(0) );
if( !StrongLucasTest(m, start), return(0), return(1) );
}


\\ test Dicksona2
Dickson2Test(m, start = "*") =
{
local(P, Q, X);
if( m%2 == 0, return(m == 2) );
if( issquare(m), return(0) ); \\ sprawdzamy, czy m nie jest liczbą kwadratową
X = MethodA(m, start);
P = X[1];
Q = X[2];
if( P == 0, return(0) ); \\ jeżeli P = 0, to m jest liczbą złożoną
if( modLucas(m + 1, P, Q, m)[2] == (2*Q) % m, return(1), return(0) );
}


\\ silny test Lucasa i test Dicksona2
StrongLucasAndDickson2Test(m, start = "*") =
{
local(a, b, c, k, P, Q, r, SLT, w, X);
if( m%2 == 0, return(m == 2) );
if( issquare(m), return(0) ); \\ sprawdzamy, czy liczba m nie jest kwadratowa
X = MethodA(m, start);
P = X[1];
Q = X[2];
if( P == 0, return(0) ); \\ jeżeli P = 0, to m jest liczbą złożoną
r = valuation(m + 1, 2); \\ znajdujemy wykładnik, z jakim liczba 2 występuje w m + 1
w = (m + 1) / 2^r;
X =  modLucas(w, P, Q, m);
a = X[1]; \\ U_w(P, Q) % m
b = X[2]; \\ V_w(P, Q) % m
SLT = 0;
if( a == 0 || b == 0, SLT = 1 ); \\ b == 0 to przypadek k == 0
c = modPower(Q, w, m); \\ Q^w % m
k = 0;
\\ sprawdzamy warunek V_(2^k * w) %m = 0; korzystamy ze wzoru V_(2*w) = (V_w)^2 - 2*Q^w
while( k++ < r,
       b = (b^2 - 2*c) % m;
       if( SLT == 0  &&  b == 0, SLT = 1 );
       c = c^2 % m;
     );
if( SLT == 0, return(0) ); \\ liczba m nie przeszła silnego testu Lucasa
b = (b^2 - 2*c) % m; \\ V_(m+1)(P, Q) % m
if( b == (2*Q) % m, return(1), return(0) );
}


\\ test BPSW2
BPSW2test(m, start = "*") =
{
forprime(p = 2, 1000, if( m % p > 0, next() ); if( m == p, return(1), return(0) ));
if( !isPrimeOrSPSP(m, 2), return(0) );
if( !StrongLucasAndDickson2Test(m, start), return(0), return(1) );
}








Przypisy

  1. Zobacz prace: Andrzej Rotkiewicz, Lucas pseudoprimes, (2000) oraz Lucas and Frobenius pseudoprimes, (2003) i Lawrence Somer, Lucas sequences [math]\displaystyle{ \{U_k\} }[/math] for which [math]\displaystyle{ U_{2 p} }[/math] and [math]\displaystyle{ U_{p} }[/math] are pseudoprimes for almost all primes [math]\displaystyle{ p }[/math], (2006)
  2. Baillie, Fiori i Wagstaff w pracy Strengthening the Baillie-PSW primality test nazywają te liczby liczbami pseudopierwszymi Lucasa-V (w skrócie: vpsp([math]\displaystyle{ P, Q }[/math])) (ang. Lucas-V pseudoprime).
  3. ang. Dickson pseudoprime of the second kind with parameters [math]\displaystyle{ P }[/math] and [math]\displaystyle{ Q }[/math]
  4. Robert Baillie and Samuel S. Wagstaff Jr., Lucas Pseudoprimes, Mathematics of Computation Vol. 35, No. 152 (1980), (LINK)
  5. 5,0 5,1 5,2 Robert Baillie, Andrew Fiori and Samuel S. Wagstaff, Jr., Strengthening the Baillie-PSW primality test, Mathematics of Computation, 90 (2021)
  6. Dana Jacobsen, Pseudoprime Statistics, Tables, and Data, (LINK)