Uma primeira tentativa poderia ser este programa.
Ao tentarmos executar o programa, vimos que
ele corretamente disse que M2 = 3, M3 = 7 e M5 = 31 são primos
mas incorretamente disse que M7 = 127 é composto!
O que aconteceu?
Ao mandarmos o programa imprimir os valores de Sn, vimos
e fica evidente que algo está muito errado.
De fato, o que os computadores chamam de int
é um elemento de
para algum valor de N;
no nosso caso, N = 32.
Como Sn cresce muito rápido, em poucos passos ultrapassamos
o limite de 2N e os valores de s calculados passam a estar errados.
A solução para o problema é fazer todas as contas modulo Mp,
já que só precisamos saber no final se Sp-2 é ou não múltiplo de Mp.
Uma versão levemente melhorada do nosso programa seria ll2.c;
esta versão do programa agora verifica corretamente que
M2 = 3, M3 = 7, M5 = 31, M7 = 127 são primos,
que
é composto e que
M13 = 8191 é primo
mas afirma incorretamente que
M17 = 131071 é composto.
O que ocorre é que apesar de M17 ainda ser bem menor do que 232,
o limite de tamanho de ints,
em contas intermediárias elevamos números na faixa de 0 a 131070
ao quadrado, e isto nos joga fora da margem de bom funcionamento
de ints.