8n+1型の素数を y^2-2z^2 という形であらわす

概要

タイトルのとおりだが、素数を2次形式で表現する手法がある。これをスクリプトで求めてみる。

コード

まず1000以下の素数を収集する。

import sympy

primes = []
for p in sympy.primerange(1000):
    if p % 8 == 1:
        primes.append(p)
print(primes)
[17, 41, 73, 89, 97, 113, 137, 193, 233, 241, 257, 281, 313, 337, 353, 401, 409, 433, 449, 457, 521, 569, 577, 593, 601, 617, 641, 673, 761, 769, 809, 857, 881, 929, 937, 953, 977]

前記であつめた素数を走査して、その素数以下のzを走査して \(y^2 = p+2z^2\) を求め、完全平方数かを判定する。

for p in primes:
    for z in range(p):
        y2 = p + 2 * z * z
        if y2 <= 0:
            break
        y, flg = sympy.integer_nthroot(y2, 2)
        if flg:
            assert p == y * y - 2 * z * z
            print(f"{p:3} = {y:2}^2 - 2 * {z:2}^2")
            # 複数あるが、最初のひとつ以外は除外する
            break
 17 =  5^2 - 2 *  2^2
 41 =  7^2 - 2 *  2^2
 73 =  9^2 - 2 *  2^2
 89 = 11^2 - 2 *  4^2
 97 = 13^2 - 2 *  6^2
113 = 11^2 - 2 *  2^2
137 = 13^2 - 2 *  4^2
193 = 15^2 - 2 *  4^2
233 = 19^2 - 2 *  8^2
241 = 21^2 - 2 * 10^2
257 = 17^2 - 2 *  4^2
281 = 17^2 - 2 *  2^2
313 = 21^2 - 2 *  8^2
337 = 25^2 - 2 * 12^2
353 = 19^2 - 2 *  2^2
401 = 23^2 - 2 *  8^2
409 = 21^2 - 2 *  4^2
433 = 21^2 - 2 *  2^2
449 = 29^2 - 2 * 14^2
457 = 23^2 - 2 *  6^2
521 = 23^2 - 2 *  2^2
569 = 31^2 - 2 * 14^2
577 = 33^2 - 2 * 16^2
593 = 25^2 - 2 *  4^2
601 = 27^2 - 2 *  8^2
617 = 25^2 - 2 *  2^2
641 = 29^2 - 2 * 10^2
673 = 31^2 - 2 * 12^2
761 = 31^2 - 2 * 10^2
769 = 29^2 - 2 *  6^2
809 = 29^2 - 2 *  4^2
857 = 37^2 - 2 * 16^2
881 = 41^2 - 2 * 20^2
929 = 31^2 - 2 *  4^2
937 = 35^2 - 2 * 12^2
953 = 31^2 - 2 *  2^2
977 = 37^2 - 2 * 14^2

参考文献