Carmichael tal

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.