Avatar billede gulbaek Nybegynder
29. januar 2004 - 23:34 Der er 7 kommentarer og
2 løsninger

Modular Exponentiation

Skal bruge lidt hjælp til at implementere Modular Exponentiation, helst inden for de næste par timer.

Jeg skal bruge det til at beregne

m^e (mod n)
Avatar billede sekhmet_ds Nybegynder
29. januar 2004 - 23:40 #1
Umiddelbart skulle du kunne beregne det direkte med metoderne i .NET frameworket: Math.Pow(m, Math.E) % n
Avatar billede gulbaek Nybegynder
29. januar 2004 - 23:44 #2
Takker, men hvordan tager den højde for mit e ?
Avatar billede gulbaek Nybegynder
29. januar 2004 - 23:48 #3
Har følgende jeg tager udgangspunkt i

1118^25 (mod 3293) = 489
Avatar billede arne_v Ekspert
30. januar 2004 - 00:19 #4
Det vil jo nok give et overflow med de simple data typer.

Der er 2 approaches:

1)  få fat i en "big integer" type og udregn 1118^25 og lav så
    % 3293 på resultatet

2)  udnyt noget matematik til at lave en genvej

    det skulle hedde "Additive Chaining" og være beskrevet i
    Applied Cryptography / Bruce Schneier

    Jeg har bogen - men 5000 km fra hvor jeg befinder mig.

    :-(
Avatar billede arne_v Ekspert
30. januar 2004 - 00:22 #5
Avatar billede arne_v Ekspert
30. januar 2004 - 00:23 #6
Det nederste burde være ret simpelt at implementere (også i C#).
Avatar billede gulbaek Nybegynder
30. januar 2004 - 00:38 #7
Har fundet en implementering af BigInteger og bruger modpow, så fik jeg det til at virke.

arne_v kom lige med et svar, så jeg kan få lukket spørgsmålet, engang når jeg er færdig med at kode.
Avatar billede arne_v Ekspert
30. januar 2004 - 01:02 #8
ok
Avatar billede arne_v Ekspert
30. januar 2004 - 15:42 #9
Medmindre du af andre årsager skal bruge big integer, så må den matematiske
genvej være hurtigere. Eksempler på implementation:

    public static int modpow1(int a, int b, int c) {
        int res = 1;
        for(int i = 0; i < b; i++) {
            res = ((a % c) *  res) % c;
        }
        return res;
    }
    public static int modpow2(int a, int b, int c) {
        if(b <= 1) {
            return (a % c);
        } else {
            return ((modpow2(a, b/2, c) % c) * (modpow2(a, b-b/2, c) % c) % c);
        }
    }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester