こことここに関連リンクがありますが、ここに短いバージョンがあります:
2つの整数の入力がa
ありb
、負の無限大と無限大の間にあります(必要な場合は範囲を制限できますが、関数は負の入力を受け入れる必要があります)。
クロネッカー記号の定義
(a|b)
入力a
およびb
場所のクロネッカーシンボルを返す必要があります
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
ここでb = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
、およびp_i
およびe_i
は、の素因数分解における素数と指数ですb
。
ここで定義されている奇数の素数のp
場合。(a|p)=a^((p-1)/2) (mod p)
の場合b == 2
、(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
の場合b == -1
、(n|-1)={-1 for n<0; 1 for n>0
もしa >= b
、(a|b) == (z|b)
どこz == a % b
。このプロパティによって、そしてこことここで説明されているように、ifのa
二次剰余です。b
z
a >= b
(-1|b)
= 1
if b == 0,1,2 (mod 4)
と-1
if b == 3 (mod 4)
。(0|b)
である0
ため除い(0|1)
ているある1
ので、(a|1)
常に1
、負のためa
、(-a|b) == (-1|b) * (a|b)
。
クロネッカーの記号の出力は常に-1, 0 or 1
出力であり、0
場合a
およびb
任意の共通因子を持っています。場合はb
、奇素数である(a|b) == 1
場合a
である平方剰余 MOD b
、そして-1
ある場合には、平方剰余ではありません。
ルール
コードはプログラムまたは関数でなければなりません。
入力は次の順序でなければなりません
a b
。出力は
-1
、0
またはのいずれかでなければなりません1
。これはコードゴルフなので、コードは効率的である必要はありません。
クロネッカーまたは関連するヤコビ記号とルジャンドル記号を直接計算する組み込み関数はありません。他の組み込み(たとえば、素因数分解)は公平なゲームです。
例
>>> kronecker(1, 5)
1
>>> kronecker(3, 8)
-1
>>> kronecker(15, 22)
1
>>> kronecker(21, 7)
0
>>> kronecker(5, 31)
1
>>> kronecker(31, 5)
1
>>> kronecker(7, 19)
1
>>> kronecker(19, 7)
-1
>>> kronecker(323, 455625)
1
>>> kronecker(0, 12)
0
>>> kronecker(0, 1)
1
>>> kronecker(12, 0)
0
>>> kronecker(1, 0)
1
>>> kronecker(-1, 5)
1
>>> kronecker(1, -5)
1
>>> kronecker(-1, -5)
-1
>>> kronecker(6, 7)
-1
>>> kronecker(-1, -7)
1
>>> kronecker(-6, -7)
-1
これは複雑な機能ですので、不明な点があればお知らせください。