/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 13.04.2 ] */ /* [wxMaxima: comment start ] Logaritmo in algebra modulare
Logaritmo modulare

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 
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 funzione zn_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:
   [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 ]
La potenza di G, elevata alla L usando come modulo P si 
calcola in questo modo:      Z:power_mod(G,L,P);
Verifica che il logaritmo modulare e' giusto:
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
print("Verifica: ",power_mod(G,L,P))$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
[wxMaxima: comment end ] */ /* Maxima can't load/batch files which end with a comment! */ "Created with wxMaxima"$