黄金比   ― 塩田研一覚書帳 ―

黄金比にまつわるあれこれのご紹介です。

フィボナッチ数列

 漸化式
a n + 2 = a n + 1 + a n  ( n = 0, 1, 2, ... ),    a 0 = a 1 = 1
で定められる数列 { a n } をフィボナッチ数列と呼びます。 始めの数項は
1,   1,   2,   3,   5,   8,   13,   21,   34,   55,   89,   144,   233,   377,   610,   987
で与えられ、自然現象のいろいろな場面に現れる有名な数列です。

 漸化式の特性方程式は
X2 = X + 1
で、特性根 ( 1 ± √5 ) / 2 を用いると一般式は
a n = { (( 1 + √5 ) / 2) n + 1 - (( 1 - √5 ) / 2) n + 1 } / √5
と書くことができます。 (※ 大学で線形代数を習った諸君はこのページの下のように一般式を求めましょう。)

黄金比

 n が十分大きければフィボナッチ数列の第 n 項は
a n ≒ { (( 1 + √5 ) / 2) n + 1} / √5
となりますので、n → ∞ のとき隣接2項の比 ( a n + 1 / a n ) は ( 1 + √5 ) / 2 に収束します。
 α = ( 1 + √5 ) / 2 は古(いにしえ)より黄金比と呼ばれ、 人間が最も美しいと感じる長方形の縦横比であると言われています。
 黄金比 α の逆数は 1 / α = α - 1 を満たしますので、これを近似値で書くと
1 / 1.618 ≒ 0.618
また α2 = α + 1 を近似値で書くと
1.6182 ≒ 2.618
.618 は覚えておくと小ネタに使えます。

正五角形の対角線

 一辺の長さが 1 の正五角形の対角線の長さは黄金比 α = ( 1 + √5 ) / 2 になります。計算してみましょう。
 正五角形の内角は 3π/5 ですから、対角線の長さは 2 cos(π/5) と表されます。 θ=π/5 とおくと 2θ= π-3θ ですから
sin(2θ) = sin(π-3θ) = sin(3θ)
倍角、3倍角の公式から
2 sin(θ) cos(θ) = 3 sin(θ) - 4 sin(θ)3
∴ 2 cos(θ) = 3 - 4 sin(θ)2 = 3 - 4 ( 1 - cos(θ)2 ) = 4 cos(θ)2 - 1
よって X = 2 cos(π/5) は X2 = X + 1 の正の根、すなわち黄金比であると言えます。

正二十面体の頂点座標

 正多面体は5種類あります。正四面体、立方体、正八面体、正十二面体、正二十面体の5つです。 何か計算しようというときに、頂点座標が上手に与えられていると嬉しいものです。 正四面体の頂点は
( 0, 0, 0 ),   ( 0, 1, 1 ),   ( 1, 0, 1 ),   ( 1, 1, 0 )
が使い易いです。立方体はいいとして、正八面体の頂点は
( ±1, 0, 0 ),   ( 0, ±1, 0 ),   ( 0, 0, ±1 )
が対称的で綺麗です。正二十面体の頂点は黄金比 α = ( 1 + √5 ) / 2 を使うと綺麗に書けるそうです:
( 0, ±1, ±α ),   ( ±α, 0, ±1 ),   ( ±1, ±α, 0 )
( 参考: Weblog on mebius.tokaichiba.jp 「正20面体の頂点座標の求め方」

正十二面体の頂点座標

 正四面体の各面の重心を、隣り合う面の重心と結ぶと再び正四面体ができます。 正四面体は自己双対(そうつい)である、と言います。
立方体と正八面体はお互いに双対、
正十二面体と正二十面体もお互いに双対です。
正二十面体の頂点座標を元に計算すると、正十二面体の頂点座標は、黄金比 α = ( 1 + √5 ) / 2 と、β = ( 2 + √5 ),   γ = ( 3 + √5 ) / 2 を用いて
( 0, ±β, ±α ),   ( ±α, 0, ±β ),   ( ±β, ±α, 0 ),   ( ±γ, ±γ, ±γ )
で与えることができます。

ユークリッドの互除法とフィボナッチ数列

 フィボナッチ数列の隣接する2項を、 大きい方からユークリッドの互除法 ( division.html 参照 ) の入力にしてみましょう:
r 0 = a n,   r 1 = a n - 1
すると r k = a n - k ( k = 0, 1, 2, ..., n ) が成り立ちますので
gcd(a n, a n - 1) = 1
ということも分かりますし、ユークリッドの互除法のループ回数は n ≒ log α(a n) であることも分かります。
 一般に a > b > 0 を満たす2数 a, b を入力したときのユークリッドの互除法のループ回数は O(log(a)) と評価されますが、 フィボナッチ数列の例から、この評価が最良であることがわかります。

加法連鎖

 公開鍵暗号では、べき乗剰余や楕円曲線のスカラー倍などの計算が必要ですが、 このとき「反復2乗法」や「反復2倍法」というアルゴリズムを用いると、 サイド・チャンネル攻撃と呼ばれる攻撃を受ける恐れがあります。 CPU の発する電磁波を測定すると「2乗」や「2倍」のタイミングが読み取れるので、 そこから秘密鍵を読み取れる、という攻撃法です。
 そこで加法連鎖を使うことが提案されました。 加法連鎖とは、数の 1 から出発して、加法のみを用いて目的の数を作り出す数列のことです。 例えば 11 を作り出すには
a 0 = 1
a 1 = a 0 + a 0 = 1 + 1 = 2
a 2 = a 0 + a 1 = 1 + 2 = 3
a 3 = a 1 + a 1 = 2 + 2 = 4
a 4 = a 2 + a 3 = 3 + 4 = 7
a 5 = a 3 + a 4 = 4 + 7 = 11
のような例があります。 { 1, 2, 3, 4, 7, 11 } は 11 を求める長さ 5 の加法連鎖である、と言います。 これをべき乗剰余 x11 mod m の計算に使うと、
y 0 = x
y 1 = y 0 * y 0 mod m   ( 理論的に = x * x mod m = x2 mod m )
y 2 = y 0 * y 1 mod m   ( 理論的に = x * x2 mod m = x3 mod m )
y 3 = y 1 * y 1 mod m   ( 理論的に = x2 * x2 mod m = x4 mod m )
y 4 = y 2 * y 3 mod m   ( 理論的に = x3 * x4 mod m = x7 mod m )
y 5 = y 3 * y 4 mod m   ( 理論的に = x4 * x7 mod m = x11 mod m )
のようになり、2乗ではない乗法のみを用いますのでサイド・チャンネル攻撃に耐えられる、という訳です。

 さらに減法も合わせて使うときは加減法連鎖と言います。 楕円曲線では減法と加法は電磁波に差を生じさせずに計算できますので、 スカラー倍計算に加減法連鎖を用いることでサイド・チャンネル攻撃に耐えることができます。 鎖はできるだけ短い方がもちろん計算量が少なくて済みますが、 目的の数を決めて短い鎖を作るのは容易ではありません。 塩田研究室では留学生の Raveen 君が加減法連鎖の研究をしていまして、次のようなアルゴリズムを提案しました。 目的の数 n から逆順に項を計算し、
  1. 次の項は、基本的に、黄金比の逆数倍付近の整数にする
  2. 数列が黄金比からある程度離れたら、ギャップを小さい数で埋める
  3. ギャップを埋めた小さい数たちも連鎖のメンバーに加える
というものです。思わぬところで黄金比が役に立ちました。

黄金比と Hecke 作用素

 保型形式の数値計算をしていると、Hecke 作用素の固有値としてよく黄金比に出会います。 重さ 2, 素数レベルの一変数保型形式の例を少し挙げておきましょう:
  • S20(23)) における Hecke 作用素 T(2) の固有値 0.618034, -1.618034
  • S20(31)) における Hecke 作用素 T(2) の固有値 1.618034, -0.618034
  • S20(67)) の2次因子における Hecke 作用素 T(2) の固有値 0.618034, -1.618034
  • S2+0(67)) における Hecke 作用素 T(2) の固有値 -0.381966, -2.618034
  • S2+0(73)) における Hecke 作用素 T(2) の固有値 -0.381966, -2.618034
  • S2+0(103)) における Hecke 作用素 T(2) の固有値 -0.381966, -2.618034
  • S2+0(107)) における Hecke 作用素 T(2) の固有値 0.618034, -1.618034
  • S2+0(167)) における Hecke 作用素 T(2) の固有値 0.618034, -1.618034
  • S2+0(191)) における Hecke 作用素 T(2) の固有値 0.618034, -1.618034
  • S2+0(193)) の2次因子における Hecke 作用素 T(2) の固有値 -0.381966, -2.618034
  • S20(199)) の2次因子における Hecke 作用素 T(2) の固有値 0.618034, -1.618034
これは、
  • Hecke 作用素の固有値は代数的整数である
  • Petersson 予想の結果として、 重さが小さいときは固有値はすべて絶対値が小さい
ことから、2次因子の固有多項式の係数がかなり限定され、√5 の体の出動率が高くなる、というのが理由です。

参考: 定数係数線形漸化式

 一般に、隣接 k + 1 項の定数係数線形漸化式
a n + k = c k - 1 a n + k - 1 + ... + c 1 a n + 1 + c 0 a n  ( n = 0, 1, 2, ... )
の解は線形空間を成します。 ( { a n }, { b n } が共に解であれば、 その一次結合 { s a n + t b n } も同じ漸化式を満たす、ということです。) 最初の k 項を決めれば数列が唯一とおりに決まりますので、 解の自由度は k、 すなわち、解の成す線形空間の次元は k です。
 特性方程式
X k = c k - 1 X k - 1 + ... + c 1 X + c 0
の根(特性根)を α とすれば
α n + k = c k - 1 α n + k - 1 + ... + c 1 α n + 1 + c 0 α n
が成り立ちますので { α n } はひとつの解を与えます。 さらに α が m 重根であれば
{ α n } ,   { n α n } , ... ,  { n m - 1 α n }
たちが全て解になることもわかります。 全ての特性根についてこのような解を書き出せば、 それらが k 個の一次独立な解、すなわち解空間の基底になります。 一般解は基底の一次結合として表され、 初期条件として a 0, ..., a k - 1 の値が与えられているときは、 基底の結合係数をそれに合うように決めるだけです。

 フィボナッチ数列の場合、特性方程式
X2 = X + 1
の2つの解
α = ( 1 + √5 ) / 2,   β = ( 1 - √5 ) / 2
は単根ですから、一般解は
a n = s α n + t β n.
と書けます。a 0 = a 1 = 1 を満たすように s, t を求めると
s = ( 1 + √5 ) / 2 √5,   t = ( √5 - 1 ) / 2 √5
となります。

戻る