Dirichletの類数公式(実2次体)を計算するMapleプログラムの例

実 2 次体に関する Dirichlet の類数公式を Maple で計算する。

Mapleプログラムの例

with(numtheory):  # issqrfree, jacobi

# Pell方程式 x^2-my^2=±4 の最小解を求める
solvePellEqCFrac4 := proc(m)
  local x, y, r, m1, d, p0, q0, p1, q1, p2, q2, s, t, a;

  # m が平方数ならエラー (非自明解なし)
  if issqr(m) then
    error("%1 is a square number.", m);
  end if;

  if m = 5 then
    x := 1; y := 1;
  elif m = 13 then
    x := 3; y := 1;
  else
    if modp(m, 4) = 0 then
      m1 := m/4;
    else
      m1 := m;
    end if;

    d := floor(sqrt(m1));
    p0 := 1; q0 := 0;
    p1 := d; q1 := 1;
    s := 0; t := 1; a := d;

    while true do
      s := a * t - s;
      t := floor((m1 - s * s) / t);
      a := floor((s + d) / t);
      p2 := a * p1 + p0;
      q2 := a * q1 + q0;
      p0 := p1; q0 := q1;
      p1 := p2; q1 := q2;

      if t = 4 and modp(m, 8) = 5 then
        x := p0; y := q0;
        break;
      elif t = 1 then
        if modp(m, 4) = 0 then
          x := 2*p0; y := q0; break;
        else
          x := 2*p0; y := 2*q0;
        end if;
        break;
      end if;
    end do;
  end if;

  r := x*x - m*y*y;

  [m, x, y, r]
end proc:

# 実 2 次体の基本単数を求める
quadunit := proc(m)
  local x, y, minsol;

  # m が square-free でないときは除外
  if not issqrfree(m) then
    error("%1 is not square-free.", m);
  end if;

  minsol := solvePellEqCFrac4(m);
  x := minsol[2];
  y := minsol[3];

  return((x + y * sqrt(m)) / 2);
end proc:

# Dirichletの類数公式 (実2次体の場合) の計算
DirichletCNF := proc(m)
  local disc, h;

  # m が square-free でないときは除外
  if not issqrfree(m) then
    error("%1 is not square-free.", m);
  end if;

  # disc:2次体の判別式
  if modp(m, 4) = 1 then
    disc := m
  elif modp(m, 4) = 2 or modp(m, 4) = 3 then
    disc := 4*m
  else
    error("%1 is a multiple of 4.", m);
  end if;

  # Dirichletの類数公式
  h := -(1/(2*log(quadunit(m)))) * 
       sum( jacobi(disc, n) * log(sin(n*Pi/disc)), n=1..abs(disc)-1 );
  h := round(h);

  return(h);
end proc:

実行例 (実 2 次体)

> for m from 2 to 100 do
    if issqrfree(m) then
      printf("h(%a) = %a\n", m, DirichletCNF(m));
    end if
  end do

実行結果:

h(2) = 1
h(3) = 1
h(5) = 1
h(6) = 1
h(7) = 1
h(10) = 2
h(11) = 1
h(13) = 1
h(14) = 1
h(15) = 2
h(17) = 1
h(19) = 1
h(21) = 1
h(22) = 1
h(23) = 1
h(26) = 2
h(29) = 1
h(30) = 2
h(31) = 1
h(33) = 1
h(34) = 2
h(35) = 2
h(37) = 1
h(38) = 1
h(39) = 2
h(41) = 1
h(42) = 2
h(43) = 1
h(46) = 1
h(47) = 1
h(51) = 2
h(53) = 1
h(55) = 2
h(57) = 1
h(58) = 2
h(59) = 1
h(61) = 1
h(62) = 1
h(65) = 2
h(66) = 2
h(67) = 1
h(69) = 1
h(70) = 2
h(71) = 1
h(73) = 1
h(74) = 2
h(77) = 1
h(78) = 2
h(79) = 3
h(82) = 4
h(83) = 1
h(85) = 2
h(86) = 1
h(87) = 2
h(89) = 1
h(91) = 2
h(93) = 1
h(94) = 1
h(95) = 2
h(97) = 1

参考文献

  • 山本芳彦:数論入門, 岩波書店, 2003.

関連記事

Pell方程式x^2-my^2=±4の最小解を求めるMapleプログラムの例
Dirichletの類数公式(虚2次体)を計算するMapleプログラムの例

【theme : 数学
【genre : 学問・文化・芸術

プロフィール

よしいず

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

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

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

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

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

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