Primers de Marsenne X46690


Statement
 

pdf   zip   main.cc

html

Escriviu una funció en C++:

int es_primer_mersenne(int n);

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

Per exemple 3 = 22−1 i 7 = 23−1 són primers de Mersenne i la funció ha de tornar 2 i 3 respectivament però ni 11, ni 15 = 24−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 231 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++