Escriviu una funció en C++:
int es_primer_mersenne(int n);per determinar si el nombre natural donat és un nombre primer de Marsenne, és a dir si és un nombre primer de la forma , amb natural. La vostra funció ha de tornar -1 si no és primer de Mersenne i si ho és.
Per exemple i són primers de Mersenne i la funció ha de tornar i respectivament però ni , ni 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
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.
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