Primers de Marsenne X46690


Statement
 

pdf   zip   main.cc

Escriviu una funció en C++:

int es_primer_mersenne(int n);

per determinar si el nombre natural donat n<231n<2^{31} és un nombre primer de Marsenne, és a dir si és un nombre primer de la forma 2m12^m-1, amb mm natural. La vostra funció ha de tornar -1 si nn no és primer de Mersenne i mm si ho és.

Per exemple 3=2213 = 2^2-1 i 7=2317 = 2^3-1 són primers de Mersenne i la funció ha de tornar 22 i 33 respectivament però ni 1111, ni 15=24115 = 2^4-1 ho són i per tant la funció ha de tornar -1 en tots dos casos.

Observacions:
(A) La vostra funció ha de ser prou "eficient" per a ser acceptada pel jutge. No es poden fer servir vectors ni funcions de la llibreria cmath. No es pot pre-calcular res.
(B) Donat que hi ha molt pocs primers de Mersenne menors a 2312^{31} la manera més eficient de resoldre aquest problema seria trobar-los tots (juntament amb la potència que els correspon) i tenir una funció que tornés aquesta potencia si el paràmetre d’entrada és un dels nombres trobats i -1 en cas contrari. El jutge ho acceptaria, però en aquest exercici demanem fer-ho sense aquest pre-càlcul.

Recomanació:
Penseu en la representació binària de les potències de 2 i proposeu una solució eficient del problema.

Observació

Només cal enviar el procediment demanat; el programa principal serà ignorat.

Sample session
es_primer_mersenne(2) → -1
es_primer_mersenne(3) → 2
es_primer_mersenne(5) → -1
es_primer_mersenne(7) → 3
es_primer_mersenne(15) → -1
Information
Author
Language
Catalan
Official solutions
C++
User solutions
C++