[C++] Potenza di potenza

ilario991
Devo risolvere il seguente problema

Descrizione del problema

Conveniamo di chiamare ennesima superpotenza di 2 il valore di 2^2n. Ad esempio la terza superpotenza di 2 è $2^(2^3) = 2^8 = 256$. Si chiede di calcolare la ennesima superpotenza di 2 modulo m.
Dati di input

Il file di input contiene due interi: n (0 <= n <= 10^5) ed m (2 <= m <= 10^4).
Dati di output

Il risultato richiesto dal problema.

Esempio:
n = 93329 k = 816, ris = 256

Il problema è che non riesco a calcolarlo senza andare in overflow.

Ho pensato, se n fosse uguale a 10

$ 2^(2^10) % m = (2^(2^5) % m * 2^(2^5)%m)%m $
Solo che con certi valori di m, con la moltiplicazione vado comunque in overflow

Risposte
Rggb1
[NOTA: mi viene illeggibile, leggo 22n, 223=28=256 che per me non ha senso]

Sei sicuro di doverlo calcolare? Rivediti magari un po' di aritmetica modulare.

ilario991
"Rggb":
[NOTA: mi viene illeggibile, leggo 22n, 223=28=256 che per me non ha senso]

Sei sicuro di doverlo calcolare? Rivediti magari un po' di aritmetica modulare.


Ho fixato. Come mi chiede il problema devo calcolare il modulo di $ 2^(2^n) % m $. Quindi, non so se c'è un modo per trovare il modulo senza calcolare tutta la potenza

apatriarca
Se $k$ è il periodo di $2$ in $(ZZ_m, *)$ allora una qualsiasi potenza $2^n \mod m = 2^{sk+r} \mod m = 2^r$. Per risolvere il tuo problema calcolerei quindi per prima cosa il periodo $k$ di $2$ e poi calcolerei il resto tra $2^n$ e $k$ per vedere a quale potenza corrisponde.

ilario991
"apatriarca":
Se $k$ è il periodo di $2$ in $(ZZ_m, *)$ allora una qualsiasi potenza $2^n \mod m = 2^{sk+r} \mod m = 2^r$. Per risolvere il tuo problema calcolerei quindi per prima cosa il periodo $k$ di $2$ e poi calcolerei il resto tra $2^n$ e $k$ per vedere a quale potenza corrisponde.


Cosa intendi per periodo?

Omega1
Ciao!

Per risolvere il problema, considera che 2^n= m^x+y.

Quindi basta calcolare x come parte intera di (2*ln(n))/(ln(m)), e successivamente calcolare il resto tra y e m.

ilario991
"Omega":
Ciao!

Per risolvere il problema, considera che 2^n= m^x+y.

Quindi basta calcolare x come parte intera di (2*ln(n))/(ln(m)), e successivamente calcolare il resto tra y e m.


y cosa rappresenta?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.