3

素数のある2次形式による表現について

193
0

 素数p60と互いに素とする。このとき、次のことが成り立つ。
p1,49  mod 60p=x215y2 p11, 59  mod 60p=x2+15y2 p17, 53  mod 60p=5x23y2 p7, 43  mod 60p=3x25y2 
確かめてみる。

具体例

p=918160で割って1余る素数で次のように書ける:
9181=139215262.
p=976960で割って49余る素数で次のように書ける:
9769=128215212.
p=949160で割って11余る素数で次のように書ける:
9491=382+15272.
p=953960で割って59余る素数で次のように書ける:
9539=942+15352.
p=967760で割って17余る素数で次のように書ける:
9677=5442312.
p=953360で割って53余る素数で次のように書ける:
9533=5442372.
p=996760で割って7余る素数で次のように書ける:
9967=3582552.
p=988360で割って43余る素数で次のように書ける:
9883=36125162.

大雑把な証明

まず、もしpがこのような式を満たすならば、上二つだとすると、x,ypと互いに素だから、
0x215y2  mod p,    x215y2  mod p,    (x2p)=(y2p)(15p)
となって
(15p)=1
を得る。ここで、pp2で割り切れないので、xypと互いに素であることを用いた。あるいは下二つであっても、やはりx,ypと互いに素なので、
03x25y2  mod p,    3x25y2  mod p,    (3p)(x2p)=(5p)(y2p)
から
(3p)=(5p),    (15p)=(3p)(5p)=(5p)2=1
を得る。ゆえに、いずれの場合も15がモジュロpでの平方剰余になる。
 逆に、15pを法とする平方剰余のとき、
15=b2pc
を満たす整数b,cが取れる。このとき、2次形式:
f(x, y)=px2+2bxy+cy2
の判別式は15になる。なお、通常の判別式の1/4のものを採用している。ところで、多少込み入った議論により、判別式が152次形式は次のいずれかに同値である。同値というのは、整数の変換:
x=αu+βv,   y=γu+δv,    αδβγ=1
という整数α,β,γ,δによる変換:f(x, y)g(u, v)で移りあうことをいう。次の形式である:
x215y2,   x2+15y2,   5x23y2,   3x25y2.
 ところで、
f(1, 0)=p
であり、f(x, y)は同値変形でこれらに移る、その際、整数組に関しては可逆変換を繰り返すから、結果的にg(u, v)になったとすると、
g(u0, v0)=p
を満たす整数u0,v0が取れることになる。
 あとは、いずれに該当するかを調べればいい。これについても平方剰余記号を使って調べられる。
p=x215y2    (p3)=1    (p5)=1.
p=x2+15y2    (p3)=1    (p5)=1.
p=5x23y2    (p3)=1    (p5)=1.
p=3x25y2    (p3)=1    (p5)=1.
証明には2135を法として平方剰余かどうかによりおなじみの計算で確かめられる。
 15pを法とする平方剰余になるための条件は、60で割った余りが、
1, 7, 11, 17, 43, 49, 59, 53
のどれかになること。これは、
1=(15p)=(3p)(5p)=(1p)(p3)(p5)
と書けることからわかる。これを4パターンに分類して主張を得る。

もっと大きい数で

今年の素数年でやってみる。

mod 60149

202008011  mod 60,   20200801=45292151442.202011011  mod 60,   20201101=45792152262.2020030949  mod 60,   20200309=46782153352.2020042949  mod 60,   20200429=56832158982.2020072949  mod 60,   20200729=45922152432.2020102949  mod 60,   20201029=57382159212.
こんな感じ。

mod 601159

2020051111  mod 60,   20200511=11832+1512002.2020123111  mod 60,   20201231=24282+1513192.2020061959  mod 60,   20200619=4392+1511662.
この3つ。

mod 601753

17の方は無かったです。53が1つだけ。
2020061353  mod 60,   20200613=524522318132.

mod 60743

202012277  mod 60,   20201227=3259725802.2020012343  mod 60,   20200123=32616252572.2020072343  mod 60,   20200723=337242520692.2020090343  mod 60,   20200903=336192519542.

求めるのに使ったコード

はじめに、何らかの方法で1~10000の間の素数をpという配列に入れる。それを使えばこのコードで指定した範囲の素数を取り出せる。日付素数はこれで出した。

      def getLargePrimes(p, a, b):
    # 1~100000000のうち、aとbの間にあるものを抽出する感じ。
    # pには1~10000の中の素数がすべて入っているとする。
    result = []
    for i in range(a, b):
        isPrime = True
        for k in p:
            if k * k > i: break
            if i % k == 0:
                isPrime = False
                break
        if isPrime:
            result.append(i)
    return result
    

その中から然るべきモジュロの素数を出してからは、次のコードで2次形式を変換しつつ整数解を求めるコードを使う。簡易的な簡約操作なので、最終形の(a, b, c)(2, 1, 7)または(2, 1, 7)になる場合がある。この場合は、
2x2+2xy7y2=5(xy)23(x2y)2,
2x2+2xy+7y2=3(x+2y)25(x+y)2
を用いて欲しい値を出す。そのために3パターン出力している。

      def routine(q):
    # まずa, b, cを出すには、モジュロqでの15の平方根を出す必要がある。
    # それをbとし、aはqで、cについては15=b^2-acから出す。すなわちc=(b^2-15)/q.
    b = 0
    for i in range(q):
        if i * i % q == 15:
            b = q - i
            break
    a = q
    c = int((b*b - 15) / q)
    # 2次形式(a, b, c)を簡約してaが±1か±2になるようにする感じ。
    # 各ステップでは新しい(c, b', a')をまずb'がbと|c|でモジュロで同じでかつ
    # 2|b'|≦|c|となるようにする。で、b'^2-a'c=15からa'を出す。
    # そのあとn=(b-b')/cを出してx'=nx+y, y'=xと変換する(x=1,y=0からスタート)。
    # 最後にxとyを出力して終了。
    x=1
    y=0
    for i in range(100):
        if abs(a)==1 or abs(a)==2: break
        if int(b) == 0: break
        b2 = b % abs(c)
        a2 = int((b2*b2-15) / c)
        n = (b - b2) / c
        a = c
        b = b2
        c = a2
        z = x
        x = n * x + y
        y = z
    print("(x, y) = (" + str(x) + ", " + str(y) + ")")
    print("(x-y, x-2y) = (" + str(x-y) + ", " + str(x-2*y) + ")")
    print("(x+2y, x+y) = (" + str(x+2*y) + ", " + str(x+y) + ")")
    print(a, b, c)

def main():
    routine(20200903)
"""
    出力結果:
    (x, y) = (289.0, 1665.0)
    (x-y, x-2y) = (-1376.0, -3041.0)
    (x+2y, x+y) = (3619.0, 1954.0)
    -2 1 7
    -2 1 7なので(x+2y, x+y)を採用。
"""
    

西暦9999年

99991009=1386821524812.

以上です。ここまでお読みいただきありがとうございました。

投稿日:20201123
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

黒狐
黒狐
34
4892
数学ちょっと好きです!

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中