Primers de Marsenne

Escriviu una funció en C++:

    int es_primer_mersenne(int n);

per determinar si el nombre natural donat n < 2³¹ és un nombre primer de
Marsenne, és a dir si és un nombre primer de la forma 2^(m) − 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 = 2² − 1 i 7 = 2³ − 1 són primers de Mersenne i la funció
ha de tornar 2 i 3 respectivament però ni 11, ni 15 = 2⁴ − 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 2³¹ 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.

Informació del problema

Autoria: INFO-FME

Generació: 2026-01-25T16:24:53.970Z

© Jutge.org, 2006–2026.
https://jutge.org
