Escriviu una funció en C++:
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.
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