/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 13.04.2 ] */ /* [wxMaxima: comment start ]
[wxMaxima: comment end ] */ /* Maxima can't load/batch files which end with a comment! */ "Created with wxMaxima"$Scelgo un primo P e calcolo la sua radice primitiva G: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ P:2^16+1$ print("Uso il primo ",P)$ print("Verifico che sia un numero primo: ",primep(P))$ G:zn_primroot(P)$ print("La piu' piccola radice primitiva di ",P, " e': ",G)$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ]Ora calcolo l'esponente da usare per ottenere Z usando come base G ed usando come modulo P. Il numero P deve essere un numero primo ossia scrivendo [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ Z:2$ L:zn_log(Z,G,P)$ print("Il logaritmo modulare di ", Z," in base ",G," modulo ",P," e' ",L)$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ]primep(P) si deve ottenere true La base G deve essere una "radice primitiva" ossia un numero che elevato ad un qualsiasi intero tra 0 ed P-1 deve dare sempre un valore diverso tra 1 ed P-1. Per conoscere il piu' piccolo intero positivo che goda della proprieta' di essere una radice primitiva si puo' usare la funzionezn_primroot(P) . Il logaritmo discreto si calcola con questa funzione:L:zn_log(Z,G,P) ; Usando numeri reali si tratterebbe di calcolare il logaritmo di Z in base G ma qui si ottiene un intero modulo il numero primo P. Ad esempio:La potenza di G, elevata alla L usando come modulo P si calcola in questo modo: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ print("Verifica: ",power_mod(G,L,P))$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ]Z:power_mod(G,L,P) ; Verifica che il logaritmo modulare e' giusto: