Eksponentiering modulo - en af operationerne på naturlige tal - eksponentiering - udført modulo . Det finder anvendelse i datalogi , især inden for kryptografi med offentlige nøgler .
Eksponentieringsmodulo er beregningen af resten af divisionen af et naturligt tal a (basis), hævet til potensen n ( eksponent ), med et naturligt tal m (modul). Udpeget:
For eksempel, hvis vi får a = 5, n = 3 og m = 13, så er løsningen c = 8 resten af divisionen med 13.
Hvis a , n og m er ikke-negative og a < m , så eksisterer der en unik løsning c med 0 ⩽ c < m .
Eksponentieringsmodulo kan også udføres med en negativ eksponent n. For at gøre dette skal du finde tallet d , det reciproke af tallet a modulo m . Dette er nemt at gøre med Euklids algoritme . På denne måde
Eksponentierende modulo er ret nemt, selv med store inputværdier. Men beregningen af den diskrete logaritme , det vil sige at finde eksponenten n for givet a , c og m , er meget vanskeligere. Denne envejsadfærd af funktionen gør den til en kandidat til brug i kryptografiske algoritmer.
Den nemmeste måde at eksponentiere modulo på er at beregne tallet direkte og derefter finde resten, når det tal divideres med m . Beregn c , hvis a = 4, n = 13 og m = 497:
Du kan bruge en lommeregner til at beregne 4 13 , vi får 67.108.864. Nu tager vi dette tal modulo 497 og får 445.
a er kun et tegn langt, n er kun to tegn langt, og værdien af et n er 8 tegn langt.
I kryptografi har a ofte 256 bit (77 decimalcifre). Overvej a = 5 × 10 76 og n = 17, som begge har ret reelle værdier. I dette eksempel er a 77 tegn langt, og n er 2 tegn langt, men resultatet af eksponentieringen er 1304 tegn langt. Sådanne beregninger er mulige på moderne computere, men hastigheden til at beregne sådanne tal er langsom. Værdierne af a og n øges for at opnå et højere sikkerhedsniveau, hvilket gør værdien af et n uhåndterlig.
Den tid, det tager at eksponentiere, afhænger af operativsystemet og processoren. Den ovenfor beskrevne måde kræver O ( n) multiplikationer.
Denne metode kræver flere operationer end den forrige. Men da der kræves mindre hukommelse, og operationer tager mindre tid, er algoritmen meget hurtigere.
Denne algoritme er baseret på det faktum, at givet a og b , er følgende 2 ligninger ækvivalente:
Algoritmen er følgende:
Hver gang i trin 3 er udtrykket sandt. Efter at trin 3 er blevet udført n gange, indeholder c den ønskede værdi. Algoritmen er således afhængig af at tælle n', indtil n' når n , når c (fra forrige iteration af sløjfen) ganges med b modulo m i den aktuelle iteration af sløjfen (for at sikre, at resultatet er lille).
For eksempel er b = 4, n = 13 og m = 497. Algoritmen gennemgår trin 3 tretten gange.
Det endelige svar c er 445, ligesom i den første metode.
Ligesom den første metode kræver det O( n) multiplikationer at fuldføre. Men da tallene brugt i disse beregninger er meget mindre, reduceres udførelsestiden for denne algoritme.
I pseudokode ser det sådan ud:
funktion modulær_pow(base, indeks_n, modul) c := 1 for index_n_prime = 1 til index_n c := (c * base) mod modul retur cAnvendelse af den hurtige eksponentieringsalgoritme for 595 703 (mod 991 ):
Vi har n = 703 =(1010111111) 2 = 2 0 +2 1 +2 2 +2 3 +2 4 +2 5 + 2 7 +2 9 .
595 703 = ((((((((595 2 ) 2 *595) 2 ) 2 * 595) 2 *595) 2 * 595) 2 *595) 2 *595) 2 *595
= (((((((238 2 *595) 2 ) 2 * 595) 2 *595) 2 * 595) 2 *595) 2 *595) 2 *595
= ((((((261 2 ) 2 * 595) 2 * 595) 2 * 595) 2 * 595) 2 * 595) 2 * 595
= (((((733 2 * 595) 2 *595) 2 * 595) 2 *595) 2 *595) 2 *595
= (((((167*595) 2 *595) 2 *595) 2 *595) 2 *595) 2 *595
= ((((265 2 *595) 2 * 595) 2 *595) 2 *595) 2 *595
= (((342 2 * 595) 2 *595) 2 *595) 2 *595
= ((605 2 *595) 2 *595) 2 *595
= (733 2 *595) 2 *595
= (167*595) 2 *595
= 265 2 * 595
= 342 .
En anden mulighed er et højre-til-venstre-layout. Det kan repræsenteres af følgende formel:
Eksempel . Ved at bruge et simpelt binært højre-til-venstre-eksponentieringsskema, lad os beregne værdien 175 235 mod 257 .
Lad os repræsentere tallet 235 i binær form:
235 10 = 11101011 2 .
1 . d := 1 * 175 mod 257 = 175,
t:= 175 2 mod 257 = 42;
2 . d := 175 * 42 mod 257 = 154,
t:= 422 mod 257 = 222;
3 . t:= 222 2 mod 257 = 197;
4 . d := 154 * 197 mod 257 = 12,
t:= 197 2 mod 257 = 2;
5 . t:= 22 mod 257 = 4;
6 . d := 12 * 4 mod 257 = 48,
t:= 42 mod 257 = 16;
7 . d := 48 * 16 mod 257 = 254,
t:= 162 mod 257 = 256;
8 . d := 254 * 256 mod 257 = 3,
9 . → d = 3. Det tog 7 kvadrater og 6 gange.
Fibonacci-tal modulo n kan effektivt findes ved at beregne Am (mod n) for en given m og en given matrix A . De anførte metoder kan nemt anvendes i denne algoritme. Dette giver en god primalitetstest for store tal n (500 bit).
Tilbagevendende algoritme for ModExp(A, b, c) = A b (mod c), hvor A er en kvadratisk matrix.
Diffie-Hellman nøgleudveksling bruger eksponentiering i endelige cykliske grupper. Ovenstående metode til at hæve en matrix til en potens strækker sig fuldstændigt til cykliske grupper. Matrix multiplikation modulo C = AB (mod n) erstattes blot af gruppemultiplikation c = ab .
I kvanteberegning er eksponentieringsmodulo en del af Shors algoritme . I denne algoritme kan du også finde ud af basen og eksponenten med hvert kald, hvilket tillader forskellige ændringer af kredsløbet [3] .
Eksponentieringsmodulo er en vigtig operation inden for datalogi, og der er effektive algoritmer (se ovenfor), der er meget hurtigere end blot at eksponentere og derefter tage resten. Der er biblioteker i programmeringssprog, der indeholder en speciel funktion til eksponentieringsmodulo: