Problem 97
最初に知られた100万桁を超える素数は1999年に発見された。そしてそれは26972593-1というメルセンヌ素数である。2098960桁である。その後、さらに多くの桁数の2p-1という形のメルセンヌ素数が見つかった。
しかしながら、2004年に2357207桁の巨大な非メルセンヌ素数が見つかった。それは、28433×27830457+1。
この素数の最後の10桁を求めよ。
http://projecteuler.net/index.php?section=problems&id=97
メルセンヌ数2n-1には、リュカテストという特別に速い素数判定法があるため、大きな素数はだいたいメルセンヌ素数ということになっている、という背景があります。
print (28433 * (1 << 7830457) + 1) % 10 ** 10
Pythonだとまともに計算しても答えが出てきてしまいます。
しかし、ここではべき乗を求めるごとに1010で割って、64ビットの範囲で計算できるようにしましょう。
def pow(n, e): if e == 0: return 1 p = pow(n, e / 2) q = p * p % 10 ** 10 if e % 2 == 1: return n * q % 10 ** 10 else: return q print (28433 * pow(2, 7830457) + 1) % 10 ** 10