Oppure

Loading
23/01/15 11:08
systrap
Salve, devo calcolare l'inverso moltiplicativo di F modulo H. Per verificare il risultato corretto uso "(F^-1)*(F) mod H" dove mi aspetto come risultato 1. Ecco un esempio di F e di H:

F:
328706977091914224451184156313209395172271077207317203412960537434506723896422227296184432479570674382948691348164
197834743939199004903333623588303052837737785375046904508
H: 206177241270426463297170516123192969338908152987550203378638225761304993437815507934017795395774148032586210898477
071869956709929256790283198654751917594383583778013629011760571554493187849075545075855761401617401748544176552117
5

Ora per verificare l'esistenza dell'inverso moltiplicativo di F devo controllare che l'mcd(H, F) sia 1 per cui usando:
def mcd(a, b):
    while b:
        a, b = b, a%b
    return a


effettivamente mcd(H, F) viene 1.

Ora posso calcolare l'inverso moltiplicativo di F:
inverso_F= ((H/F)+1)


Ho come risultato "inverso_F":
6272371919041269490801350467333545851683796097523842378994

A questo punto controllo che (F^-1)*F mod H mi dia come risultato 1:
risultato = (inverso_F*F)%H


Dove "risultato":
328706977091914224451184156313209395172271077207317203411145650947554439831469652893949161704814753056230884716316
088928438601322806807186385313180938357638772364497583777

Invece risultato doveva essere 1.

Se la mia matematica non è scorretta, credo che il problema stia nella divisione tra numeri molto grandi. Come faccio a dividere due numeri grandi in python?

Grazie :)
Ultima modifica effettuata da systrap 23/01/15 11:10
aaa
23/01/15 16:08
pierotofy
Python supporta grandi numeri *interi*, non float. Forse la parte dove fai H/F da un errore di approssimazione.

Prova ad usare il modulo decimal. docs.python.org/2/library/…
Il mio blog: piero.dev
23/01/15 18:39
systrap
Ho risolto alla fine con la libreria gmpy che mi calcola l'inverso moltiplicativo nel modo corretto
gmpy.invert(F,H)


Grazie cmq :)
Ultima modifica effettuata da systrap 23/01/15 18:40
aaa