Vi er ikke helt færdige med Fermats primtalstest.
I afsnittet om Fermats primtalstest diskuterer jeg hvordan man kan teste om et stort tal m er et primtal.
Mere præcist; vi så på hvor mange af tallene a = 1,2,3, …, m – 1 som opfylder at
\(a^{m-1} \equiv 1 \textrm{ mod } m \)
Hvis m er et primtal, så skal \(a^{m-1} \equiv 1 \textrm{ mod } m \) for alle værdier af a, fra a = 1, til a = m – 1.
Hvis vi bare har en værdi af a, så \(a^{m-1}\) ikke er lig 1, modulo m, så kan m ikke være et primtal.
Vi så også, at for langt de fleste tal m, som ikke er primtal, så vil de a‘er, hvor \(a^{m-1} \equiv 1 \textrm{ mod } m \), typisk kun udgøre få procent af samtlige a‘er fra a = 1 til a = m -1.
I dette afsnit vil vi ikke se på alle værdier af a, fra a = 1 til a = m – 1. Vi vil kun se på de værdier af a som er primiske med m.
Python-program
Ved at ændre minimalt i python-programmet fra forrige afsnit, så kan jeg, for hver værdi af m, optælle hvor mange af a‘erne der både er primiske med m, og som giver 1, når a opløftes i potensen m – 1. Vi regner naturligvis modulo m.
import math mmax=1000 for m in range(1,mmax+1): antal=0 antal_primiske=0 for a in range(1,m): if math.gcd(a,m)==1: antal_primiske+=1 if pow(a,m-1,m)==1: antal+=1 print(m,antal_primiske,antal)
I pakken math, som vi importerer, ligger funktionen gcd, som beregner den største fælles divisor for to tal.
Jeg har brugt antal_primiske til at tælle de a‘er som er primiske med m.
Jeg har brugt antal til at tælle de a‘er som opfylder at \(a^{m-1} \equiv 1 \textrm{ mod } m \). Bemærk at antal kun forøges hvis a både er primiske med m og \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Eksempel på output af første resultater:
1 0 0 2 1 1 3 2 2 4 2 1 5 4 4 6 2 1 7 6 6 8 4 1 9 6 2 10 4 1
I hver række står der tre tal;
- Første tal er værdien af m.
- Andet tal er antallet af a‘er, fra a = 1, til a = m -1, der er primiske med m.
- Tredie tal er antallet af de tal, der er primiske med m, som også opfylder at \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Række 2: Når m = 2, så er der ét tal der er primisk med m; det er tallet 1. Og tallet 1 opfylder, at \(1^{2-1} \equiv 1 \textrm{ mod } 2 \). Derfor står der i række 2; “2 1 1”
\(1^{4-1} = 1^3 = 1 \equiv 1 \textrm{ mod } 4\)
\(3^{4-1} = 3^3 = 27 \equiv 3 \textrm{ mod } 4\)
Række 3: Når m = 3, så er der to tal som er primiske med m, og for begge de to tal gælder at \(a^{m-1} \equiv 1 \textrm{ mod } m \):
\(1^{3-1} = 1^2 = 1 \equiv 1 \textrm{ mod } 3\) \(2^{3-1} = 2^2 = 4 \equiv 1 \textrm{ mod } 3\)
Række 4. Når m = 4, så er der to tal som er primisk med m. Det er tallene 1 og 3. Opfylder de at \(a^{m-1} \equiv 1 \textrm{ mod } m \) ?
\(1^{4-1} = 1^3 = 1 \equiv 1 \textrm{ mod } 4\) \(3^{4-1} = 3^3 = 27 \equiv 3 \textrm{ mod } 4\)
Så det er kun tallet a = 1 der både er primisk med 4 og som opfylder at \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Figur
Jeg har, for alle værdier af m fra m = 1 til m = 105, optalt antal a‘er der er primiske med m, og antal a‘er som både er primiske med m og som opfylder at \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Jag har så divideret antal med antal_primiske, og omregnet til procent.
Figuren viser resultaterne:
De værdier af m hvor procenten er 100 er primtallene. Når m er et primtal, så vil alle værdier af a, fra a = 1 til a = m – 1, både være primiske med m og opfylde at \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Man kan så omvendt spørge; findes der værdier af m, som ikke er primtal, hvor der for alle a‘er, som er primiske med m, også gælder at \(a^{m-1} \equiv 1 \textrm{ mod } m \) ?
Svaret er ‘ja’, der findes sammensatte tal m som opfylder, at der for alle a‘er primiske med m, gælder at \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Disse tal kaldes Carmichael-tal. Det mindste af disse tal er 561. Der er 320 tal fra a = 1 til a = 560 som er primiske med 561. For alle disse 320 værdier af a gælder der at \(a^{560} \equiv 1 \textrm{ mod } 561 \).
Tallet 561 er ikke et primtal; \(561 = 3 \cdot 11 \cdot 17\).
Hvis vi derfor vil teste om et tal m er et primtal, og kun kontrollerer for a‘er der er primiske med m, så kan vi komme ud for værdier af m hvor alle a‘er opfylder ligningen \(a^{m-1} \equiv 1 \textrm{ mod } m \).
Figuren viser situationen.