Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 46

Discussione: Aritmetica modulare

  1. #1
    Utente bannato
    Registrato dal
    Jul 2009
    Messaggi
    60

    Aritmetica modulare

    Qualcuno sa come eseguire questo calcolo

    98^(7253) (mod 143)

    senza eseguire brutalmente l'esponenziale 98^7253 ??

    grazie !

  2. #2

  3. #3
    Utente bannato
    Registrato dal
    Jul 2009
    Messaggi
    60
    Originariamente inviato da fred84
    http://www.wolframalpha.com/input/?i...253%29+mod+143
    bello sto link lo ho messo nei preferiti

    però volevo anche sapere se c'era un modo per risolverlo a manina

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Purtroppo 7253 e' primo, quindi non puoi ridurre nulla. Altrimenti avresti potuto utilizzare il teorema di euler, la funzione di carmichael, etc.

    Di conseguenza ti tocca fare un po' di esponenziazione modulare.

    partiamo dal risultato=1, base=98.
    dividiamo l'esponente a 2 fino ad arrivare a 0; prendiamo il valore assoluto del risultato
    ad ogni passo facciamo che base=base^2 mod 143
    ad ogni passo con un valore dispari facciamo che risultato = risultato*base mod 143

    quindi abbiamo

    7253
    risultato = 1*98 mod 143 = 98
    base = 98^2 mod 143 = 23
    3626
    base = 23^2 mod 143 = 100
    1813
    risultato = 98*100 mod 143 = 76
    base = 100^2 mod 143 = 133
    906
    base = 133^2 mod 143 = 100
    453
    risultato = 76*100 mod 143 = 21
    base = 100^2 mod 143 = 133
    226
    base = 133^2 mod 143 = 100
    113
    risultato = 21*100 mod 143 = 98
    base = 100^2 mod 143 = 133
    56
    base = 133^2 mod 143 = 100
    28
    base = 100^2 mod 143 = 133
    14
    base = 133^2 mod 143 = 100
    7
    risultato = 98*100 mod 143 = 76
    base = 100^2 mod 143 = 133
    3
    risultato = 76*133 mod 143 = 98
    base = base = 133^2 mod 143 = 100
    1
    risultato = 98*100 mod 143 = 76

    in c tutto questo dovrebbe essere piu' o meno cosi':
    codice:
    int mod_pow(int base, int exp, int mod){
            int result = 1;
            while (exp>0){
                    if (exp & 1 == 1)
                            result = result * base % mod;
                    exp = exp >> 1;
                    base = base * base % mod;
            }
            return result;
    }

  5. #5


    giuro che mi fate paura.
    "ci vorrebbero anche più persone come quaestio (a reb verrà un brivido)" wallrider, 22/10/2012

    "Se hai una vita di merda facebook non può essere molto meglio...". kalosjo, 16/10/2012

  6. #6
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    per gli interessati diamo anche la versione C#

    codice:
            private static int mod_pow(int labase, int exp, int mod)
            {
                int result = 1;
                while (exp > 0)
                {
                    if ((exp & 1) > 0)
                        result = result * labase % mod;
                    exp = exp >> 1;
                    labase = labase * labase % mod;
                }
                return result;
            }
    mod_pow(98, 7253, 143);//risultato 71
    I got the remedy

  7. #7
    Utente di HTML.it L'avatar di fred84
    Registrato dal
    Dec 2005
    Messaggi
    434
    Originariamente inviato da albgen
    risultato 71
    che è sbagliato

  8. #8
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da fred84
    che è sbagliato
    ho sbagliato a scrivere...è 76 e ovviamente l'agoritmo è corretto.
    I got the remedy

  9. #9
    Utente bannato
    Registrato dal
    Jul 2009
    Messaggi
    60
    grazie raga

  10. #10
    Originariamente inviato da bubi1
    in c tutto questo dovrebbe essere piu' o meno cosi':
    codice:
    int mod_pow(int base, int exp, int mod){
            int result = 1;
            while (exp>0){
                    if (exp & 1 == 1)
                            result = result * base % mod;
                    exp = exp >> 1;
                    base = base * base % mod;
            }
            return result;
    }

    Originariamente inviato da albgen
    per gli interessati diamo anche la versione C#

    codice:
            private static int mod_pow(int labase, int exp, int mod)
            {
                int result = 1;
                while (exp > 0)
                {
                    if ((exp & 1) > 0)
                        result = result * labase % mod;
                    exp = exp >> 1;
                    labase = labase * labase % mod;
                }
                return result;
            }
    Beh, in effetti è decisamente diverso.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.