Kronecker指標を計算するRubyプログラム

Kronecker(クロネッカー)指標を計算するRubyプログラムの紹介。

プログラム

#!ruby -Ks

# Kronecker指標の計算
def kronecker_char(disc, a)

  # a, nが互いに素でないときは0を返す
  if gcd(disc, a) != 1
    return 0
  end

  if disc % 4 == 1
    jacobi_symbol(a, disc.abs)
  elsif disc % 8 == 4
    char_mod_4 = (-1) ** ( (a-1)/2 )
    # char_mod_4 = (n % 4 == 3) ? -1 : 1
    if disc == -4
      char_mod_4
    else
      char_mod_4 * jacobi_symbol(a, (disc/4).abs)
    end
  elsif disc % 32 == 8
    char_mod_8 = (-1) ** ( (a*a-1)/8 )
    # char_mod_8 = (n % 8 == 3 or n % 8 == 5) ? -1 : 1
    if disc == 8
      char_mod_8
    else 
      char_mod_8 * jacobi_symbol(a, (disc/8).abs)
    end
  elsif disc % 32 == 24
    char_mod_8 = (-1) ** ( (a*a-1)/8 + (a-1)/2 )
    # char_mod_8 = (n % 8 == 5 or n % 8 == 7) ? -1 : 1
    if disc == -8
      char_mod_8
    else 
      char_mod_8 * jacobi_symbol(a, (disc/8).abs)
    end
  else
    # 判別式の値が不正
    return  #=> nil
  end
end

# Jacobi記号の計算
def jacobi_symbol(a, n)

  # Jacobi記号の値
  val = 1

  # 未定義の引数への対応
  if n < 3 or n % 2 == 0
    return  #=> nil
  end

  # a, nが互いに素でないときは0を返す
  if gcd(a, n) != 1
    return 0
  end

  # 第一補充法則を適用:
  if a < 0
    val *= (-1) ** ( (n-1)/2 )
    # val *= (n % 4 == 3) ? -1 : 1
    a = -a
  end

  while not_square?(a) do
    if a > n
      a %= n
    elsif a % 2 == 0
      a /= 4 while a % 4 == 0  # (4/n)=1
      if a % 2 == 0
        # 第二補充法則を適用
        val *= (-1) ** ( (n*n-1)/8 )
        # val *= (n % 8 == 3 or n % 8 == 5) ? -1 : 1
        a /= 2
      end
    else
      # 相互法則を適用
      val *= (-1) ** ( (a-1)*(n-1)/4 )
      # val *= (a % 4 == 3 and n % 4 == 3) ? -1 : 1
      n, a = a, n; 
    end
  end

  # (a/n)におけるaが平方数の場合(whileループ脱出)
  val
end

# 平方数でないかどうかの判定
def not_square?(a)
  (a > 0 && Math.sqrt(a).round ** 2 == a) ? false : true
end

# 最大公約数
def gcd(a, b)
  a = -a if a < 0
  b = -b if b < 0
  while b > 0
    a, b = b, a % b
  end
  a
end

# ======================================

if $0 == __FILE__ 

disc = -4
0.upto(disc.abs-1) do |i|
  val = kronecker_char(disc, i)
  puts "\\chi_{#{disc}}(#{i} mod #{disc.abs}) = #{val}"
end
puts

disc = 12
0.upto(disc.abs-1) do |i|
  val = kronecker_char(disc, i)
  puts "\\chi_{#{disc}}(#{i} mod #{disc.abs}) = #{val}"
end
puts

end

実行結果は以下の通りです。

\chi_{-4}(0 mod 4) = 0
\chi_{-4}(1 mod 4) = 1
\chi_{-4}(2 mod 4) = 0
\chi_{-4}(3 mod 4) = -1

\chi_{12}(0 mod 12) = 0
\chi_{12}(1 mod 12) = 1
\chi_{12}(2 mod 12) = 0
\chi_{12}(3 mod 12) = 0
\chi_{12}(4 mod 12) = 0
\chi_{12}(5 mod 12) = -1
\chi_{12}(6 mod 12) = 0
\chi_{12}(7 mod 12) = -1
\chi_{12}(8 mod 12) = 0
\chi_{12}(9 mod 12) = 0
\chi_{12}(10 mod 12) = 0
\chi_{12}(11 mod 12) = 1

2次体の判別式discに対して定まるKronecker指標の値は、discの絶対値を法として定まります(つまり、discの絶対値を法として等しい整数どうしは、そのKronekcer指標の値も等しい)。また、discに対して定まるKronecker指標は、実際に、discの絶対値を法とする既約剰余類群の指標(=既約剰余類群から0でない複素数全体のなす乗法群への準同型写像)になります。

有理素数の2次体における素イデアル分解について

有理素数pの2次体における素イデアル分解の様子が、Kronecker指標の計算によってわかります。つまり、2次体Kの判別式をdiscとすれば、

  • kronecker_char(disc, p)が1のとき、pはKにおいて分解する。
  • kronecker_char(disc, p)が-1のとき、pはKにおいて惰性する。
  • kronecker_char(disc, p)が0のとき、pはKにおいて分岐する。

参考文献

木田雅成:数理・情報系のための整数論講義、サイエンス社、2007
高木貞治:初等整数論講義 第2版、共立出版、1971

【theme : 算数・数学の学習
【genre : 学校・教育

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示