FRACTRAN(フラクトラン) はチューリング完全 かんぜん な難解 なんかい プログラミング言語 げんご で、数学 すうがく 者 しゃ ジョン・コンウェイ によって開発 かいはつ された。この言語 げんご で書 か かれたプログラムは、正 せい の整数 せいすう n を初期 しょき 値 ち として持 も つ正 せい の分数 ぶんすう の列 れつ である。プログラムは、以下 いか のように整数 せいすう n を更新 こうしん することによって実行 じっこう される。
nf が整数 せいすう となるようなリスト内 ない の最初 さいしょ の分数 ぶんすう f において、n をnf に置換 ちかん する。
nをかけて整数 せいすう となるような分数 ぶんすう がリスト内 ない になくなるまでこれを繰 く り返 かえ し、停止 ていし する。
Conway 1987 には、PRIMEGAME(素数 そすう ゲーム)と呼 よ ばれる、連続 れんぞく する素数 そすう を探索 たんさく する以下 いか のFRACTRANプログラムがある。
(
17
91
,
78
85
,
19
51
,
23
38
,
29
33
,
77
29
,
95
23
,
77
19
,
1
17
,
11
13
,
13
11
,
15
2
,
1
7
,
55
1
)
{\displaystyle \left({\frac {17}{91}},{\frac {78}{85}},{\frac {19}{51}},{\frac {23}{38}},{\frac {29}{33}},{\frac {77}{29}},{\frac {95}{23}},{\frac {77}{19}},{\frac {1}{17}},{\frac {11}{13}},{\frac {13}{11}},{\frac {15}{2}},{\frac {1}{7}},{\frac {55}{1}}\right)}
n =2として始 はじ め、このFRACTRANプログラムは以下 いか の整数 せいすう 列 れつ を生成 せいせい する。
2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ... (オンライン整数 せいすう 列 れつ 大 だい 辞典 じてん の数列 すうれつ A007542 )
2の後 のち 、この数列 すうれつ は以下 いか の2の冪 べき 乗 じょう を含 ふく む。
2
2
=
4
,
2
3
=
8
,
2
5
=
32
,
2
7
=
128
,
2
11
=
2048
,
2
13
=
8192
,
2
17
=
131072
,
2
19
=
524288
,
…
{\displaystyle 2^{2}=4,\,2^{3}=8,\,2^{5}=32,\,2^{7}=128,\,2^{11}=2048,\,2^{13}=8192,\,2^{17}=131072,\,2^{19}=524288,\,\dots }
(オンライン整数 せいすう 列 れつ 大 だい 辞典 じてん の数列 すうれつ A034785 )
これらの2のべき乗 じょう の指数 しすう 部分 ぶぶん は2, 3, 5, …というような素数 そすう である。
FRACTRANプログラムはレジスタが引数 ひきすう n の素数 そすう 指数 しすう として格納 かくのう されるレジスタマシン として見 み ることができる。
ゲーデル数 すう を用 もち いて、正 せい の整数 せいすう n は任意 にんい の数 かず の任意 にんい の大 おお きさの正 せい の整数 せいすう の変数 へんすう を符号 ふごう 化 か することができる。[注釈 ちゅうしゃく 1] 各 かく 変数 へんすう の値 ね は、整数 せいすう の素因数 そいんすう 分解 ぶんかい によって素数 そすう のべき乗 じょう に符号 ふごう 化 か される。例 たと えば、整数 せいすう
60
=
2
2
×
3
1
×
5
1
{\displaystyle 60=2^{2}\times 3^{1}\times 5^{1}}
は、レジスタの状態 じょうたい が以下 いか のようになっていることを表 あらわ す。
ある変数 へんすう (これをv2とする)の値 ね が2である。
ほかの変数 へんすう の2つ(これをv3とv5とする)の値 ね が1である。
ほかの全 すべ ての変数 へんすう の値 ね が0である。
FRACTRANプログラムは、正 せい の分数 ぶんすう の列 れつ である。すべての分数 ぶんすう はそれぞれ、1つ以上 いじょう の変数 へんすう をテストする命令 めいれい を表 あらわ し、それはその分母 ぶんぼ の素因数 そいんすう によって表 あらわ される。例 たと えば、
f
1
=
21
20
=
3
×
7
2
2
×
5
1
{\displaystyle f_{1}={\frac {21}{20}}={\frac {3\times 7}{2^{2}\times 5^{1}}}}
はv2とv5を評価 ひょうか する。
v
2
≥
2
{\displaystyle v_{2}\geq 2}
かつ
v
5
≥
1
{\displaystyle v_{5}\geq 1}
のとき、v2から2を、v5から1をそれぞれ引 ひ き、v3に1を、v7に1を加 くわ える。以下 いか に例 れい を挙 あ げる。
60
⋅
f
1
=
2
2
×
3
1
×
5
1
⋅
3
×
7
2
2
×
5
1
=
3
2
×
7
1
{\displaystyle 60\cdot f_{1}=2^{2}\times 3^{1}\times 5^{1}\cdot {\frac {3\times 7}{2^{2}\times 5^{1}}}=3^{2}\times 7^{1}}
FRACTRANプログラムは分数 ぶんすう のリストに過 す ぎず、これらの評価 ひょうか ・演算 えんざん 命令 めいれい (加算 かさん ・減算 げんざん 命令 めいれい )はFRACTRAN言語 げんご において唯一 ゆいいつ 許 ゆる された命令 めいれい である。さらに、以下 いか の制約 せいやく が適用 てきよう される。
命令 めいれい が実行 じっこう されるごとに、評価 ひょうか される変数 へんすう はデクリメント(減算 げんざん ) される。
同 おな じ変数 へんすう に対 たい して、1つの命令 めいれい でインクリメント(加算 かさん ) とデクリメント(減算 げんざん ) を両方 りょうほう することはできない。(そうでなければ、その命令 めいれい を表 あらわ す分数 ぶんすう が既 すんで 約分 やくぶん 数 すう にならない。)したがって、すべてのFRACTRANの命令 めいれい は変数 へんすう の評価 ひょうか においてその変数 へんすう を消費 しょうひ する。
FRACTRANの命令 めいれい は、変数 へんすう が0 かどうかを直接 ちょくせつ 評価 ひょうか することはできない。(しかし、既定 きてい の命令 めいれい を作成 さくせい して、それを特定 とくてい の変数 へんすう を評価 ひょうか する別 べつ の命令 めいれい の後 のち に配置 はいち することで、間接 かんせつ 的 てき な評価 ひょうか は可能 かのう である。)
最 もっと も単純 たんじゅん なFRACTRANプログラムは以下 いか の1つの命令 めいれい である。
(
3
2
)
{\displaystyle \left({\frac {3}{2}}\right)}
このプログラムは以下 いか の単純 たんじゅん なアルゴリズム に表 あらわ される。
FRACTRAN命令 めいれい
条件 じょうけん
アクション
3
2
{\displaystyle {\frac {3}{2}}}
v2 > 0
v2から1を引 ひ き、v3に1を加 くわ える
v2 = 0
停止 ていし する
2
a
3
b
{\displaystyle 2^{a}3^{b}}
の形 かたち で与 あた えられた初期 しょき 値 ち に対 たい し、このプログラムは以下 いか の数列 すうれつ を計算 けいさん する。
2
a
−
1
3
b
+
1
{\displaystyle 2^{a-1}3^{b+1}}
,
2
a
−
2
3
b
+
2
{\displaystyle 2^{a-2}3^{b+2}}
, …
これを
a
{\displaystyle a}
ステップ行 おこな い、最終 さいしゅう 的 てき に2で割 わ り切 き れなくなり、
3
2
{\displaystyle {\frac {3}{2}}}
をかけても整数 せいすう とならなくなったとき、レジスタマシンは
3
a
+
b
{\displaystyle 3^{a+b}}
を出力 しゅつりょく して停止 ていし する。これにより、2つの整数 せいすう が加算 かさん される。
「乗算 じょうざん 器 き 」は、「加算 かさん 器 き 」を「ループする」ことで作 つく ることができる。これには、アルゴリズムにState (オブジェクト指向 しこう プログラミング におけるデザインパターン の1つ)を導入 どうにゅう する必要 ひつよう がある。このアルゴリズムは
2
a
3
b
{\displaystyle 2^{a}3^{b}}
を引数 ひきすう に取 と り、
5
a
b
{\displaystyle 5^{ab}}
を生成 せいせい する。
State
条件 じょうけん
アクション
次 つぎ のState
A
v7 > 0
v7から1を引 ひ き、v3に1を加 くわ える
A
v7 = 0 かつ v2 > 0
v2から1を引 ひ く
B
v7 = 0 かつ v2 = 0 かつ v3 > 0
v3から1を引 ひ く
A
v7 = 0 かつ v2 = 0 かつ v3 = 0
停止 ていし する
B
v3 > 0
v3から1を引 ひ き、v5とv7にそれぞれ1を加 くわ える
B
v3 = 0
なし
A
BのStateはv3とv5を加算 かさん しv3をv7に値 ね を移 うつ すループである。また、AのStateは、BのStateをv2回 かい 繰 く り返 かえ す外側 そとがわ の制御 せいぎょ ループである。AのStateはまた、BのStateのループが完了 かんりょう した後 のち 、v7からv3に値 ね を移 うつ す(つまり、v3から一 いち 度 ど v7に移動 いどう して、またv3に戻 もど る)。
新 あたら しい変数 へんすう をStateインジケータ として用 もち いることで、Stateを実行 じっこう することができる。B用 よう のStateインジケータはv11とv13である。ここで、1つのループにState制御 せいぎょ インジケータは第 だい 一 いち のフラグ (v11)と第 だい 二 に のフラグ(v13)の2つが必要 ひつよう となることに留意 りゅうい されたい。なぜなら、それぞれのインジケータは評価 ひょうか されると消費 しょうひ されるため、「現在 げんざい のStateを継続 けいぞく せよ」と言 い うために第 だい 二 に のインジケータが必要 ひつよう となるからである。この第 だい 二 に のインジケータは、次 つぎ の命令 めいれい で第 だい 一 いち のインジケータに還元 かんげん され、ループが継続 けいぞく する。
乗算 じょうざん アルゴリズムの表 ひょう にFRACTRAN Stateインジケータと命令 めいれい を追加 ついか すると以下 いか のようになる。
FRACTRAN命令 めいれい を書 か き出 だ すとき、最後 さいご にAのStateの命令 めいれい が必要 ひつよう になる。AのStateにはインジケータがないからである。Stateインジケータが設定 せってい されていないのが既定 きてい のStateである。ゆえに、乗算 じょうざん 器 き のFRACTRANプログラムは以下 いか のようになる。
(
455
33
,
11
13
,
1
11
,
3
7
,
11
2
,
1
3
)
{\displaystyle \left({\frac {455}{33}},{\frac {11}{13}},{\frac {1}{11}},{\frac {3}{7}},{\frac {11}{2}},{\frac {1}{3}}\right)}
入力 にゅうりょく 2a 3b に対 たい してこのプログラムは5ab を出力 しゅつりょく する。 [注釈 ちゅうしゃく 2]
上記 じょうき のFRACTRANプログラムで3×2を計算 けいさん する(3×2は6であるから、入力 にゅうりょく は
2
3
×
3
2
=
72
{\displaystyle 2^{3}\times 3^{2}=72}
で、出力 しゅつりょく は
5
6
=
15625
{\displaystyle 5^{6}=15625}
となる)
同様 どうよう に、FRACTRAN「減算 げんざん 器 き 」を作 つく ることができる。さらに、減算 げんざん を繰 く り返 かえ すことで、以下 いか の「商 しょう とあまり」のアルゴリズムを作 つく ることもできる。
FRACTRAN命令 めいれい
State
State インジケータ
条件 じょうけん
アクション
次 つぎ のState
7
⋅
13
2
⋅
3
⋅
11
,
11
13
{\displaystyle {\frac {7\cdot 13}{2\cdot 3\cdot 11}},{\frac {11}{13}}}
A
v11, v13
v2 > 0 かつ v3 > 0
v2とv3からそれぞれ1を引 ひ き、v7に1を加 くわ える
A
1
3
⋅
11
{\displaystyle {\frac {1}{3\cdot 11}}}
v2 = 0 かつ v3 > 0
v3から1を引 ひ く
X
5
⋅
17
11
{\displaystyle {\frac {5\cdot 17}{11}}}
v3 = 0
v5に1を加 くわ える
B
3
⋅
19
7
⋅
17
,
17
19
{\displaystyle {\frac {3\cdot 19}{7\cdot 17}},{\frac {17}{19}}}
B
v17, v19
v7 > 0
v7から1を引 ひ き、v3に1を加 くわ える
B
11
17
{\displaystyle {\frac {11}{17}}}
v7 = 0
なし
A
1
3
{\displaystyle {\frac {1}{3}}}
X
v3 > 0
v3から1を引 ひ く
X
v3 = 0
停止 ていし する
FRACTRANプログラムに書 か き出 だ すと、以下 いか のようになる。
(
91
66
,
11
13
,
1
33
,
85
11
,
57
119
,
17
19
,
11
17
,
1
3
)
{\displaystyle \left({\frac {91}{66}},{\frac {11}{13}},{\frac {1}{33}},{\frac {85}{11}},{\frac {57}{119}},{\frac {17}{19}},{\frac {11}{17}},{\frac {1}{3}}\right)}
入力 にゅうりょく 2n 3d 11に対 たい して、このプログラムは5q 7r を出力 しゅつりょく する。ここに、n = qd + r かつ 0 ≤ r < d である。
コンウェイの素数 そすう 生成 せいせい アルゴリズム(前述 ぜんじゅつ )は本質 ほんしつ 的 てき に、2 ふた つのループ内 ない の商 しょう とあまりのアルゴリズムである。
2
n
7
m
{\displaystyle 2^{n}7^{m}}
(ただし0 ≤ m < n )の形 かたち で与 あた えられた入力 にゅうりょく に対 たい し、アルゴリズムはn +1の最大 さいだい の約数 やくすう k を見 み つけるまでn +1をn から1までの整数 せいすう でそれぞれ割 わ ろうとする。そして2n +1 7k -1 を返 かえ し、繰 く り返 かえ す。このアルゴリズムで生成 せいせい されるStateの番号 ばんごう の列 れつ はkが1のとき2のべき乗 じょう を生成 せいせい する(7の指数 しすう は0になる)のは、2の指数 しすう が素数 そすう のときのみである。Havil (2007)に、コンウェイのアルゴリズムの段階 だんかい 的 てき な説明 せつめい がある。
このプログラムにおいて、素数 そすう 2, 3, 5, 7 ... を得 え るには、それぞれ19, 69, 281, 710, ...のステップが必要 ひつよう となる。(オンライン整数 せいすう 列 れつ 大 だい 辞典 じてん の数列 すうれつ A007547 )
コンウェイのプログラムには前述 ぜんじゅつ のものより分数 ぶんすう が2つ異 こと なる版 はん も存在 そんざい する。[1]
(
17
91
,
78
85
,
19
51
,
23
38
,
29
33
,
77
29
,
95
23
,
77
19
,
1
17
,
11
13
,
13
11
,
15
14
,
15
2
,
55
1
)
{\displaystyle \left({\frac {17}{91}},{\frac {78}{85}},{\frac {19}{51}},{\frac {23}{38}},{\frac {29}{33}},{\frac {77}{29}},{\frac {95}{23}},{\frac {77}{19}},{\frac {1}{17}},{\frac {11}{13}},{\frac {13}{11}},{\frac {15}{14}},{\frac {15}{2}},{\frac {55}{1}}\right)}
こちらの方 ほう が少 すこ し速 はや い。2, 3, 5, 7... を得 え るのには19, 69, 280, 707... のステップが必要 ひつよう である。(オンライン整数 せいすう 列 れつ 大 だい 辞典 じてん の数列 すうれつ A007546 )このプログラムの特定 とくてい の整数 せいすう N が素数 そすう であるか調 しら べる反復 はんぷく には、以下 いか の数 かず のステップが必要 ひつよう である。
N
−
1
+
(
6
N
+
2
)
(
N
−
b
)
+
2
∑
d
=
b
N
−
1
⌊
N
d
⌋
{\displaystyle N-1+(6N+2)(N-b)+2\sum \limits _{d=b}^{N-1}\left\lfloor {\frac {N}{d}}\right\rfloor }
このとき、
b
<
N
{\displaystyle b<N}
は最大 さいだい のN の整数 せいすう の約数 やくすう であり、
⌊
x
⌋
{\displaystyle \lfloor x\rfloor }
は床 ゆか 関数 かんすう である。[2]
以下 いか は、1999年 ねん の、Devin Kilminsterによる、これより少 すこ し短 みじか い、10の命令 めいれい からなるプログラムである。[3]
(
7
3
,
99
98
,
13
49
,
39
35
,
36
91
,
10
143
,
49
13
,
7
11
,
1
2
,
91
1
)
{\displaystyle \left({\frac {7}{3}},{\frac {99}{98}},{\frac {13}{49}},{\frac {39}{35}},{\frac {36}{91}},{\frac {10}{143}},{\frac {49}{13}},{\frac {7}{11}},{\frac {1}{2}},{\frac {91}{1}}\right)}
初期 しょき 値 ち n = 10において、連続 れんぞく した素数 そすう が後続 こうぞく する10のべき乗 じょう によって生成 せいせい される。
以下 いか のFRACTRANプログラム
(
3
⋅
11
2
2
⋅
5
,
5
11
,
13
2
⋅
5
,
1
5
,
2
3
,
2
⋅
5
7
,
7
2
)
{\displaystyle \left({\frac {3\cdot 11}{2^{2}\cdot 5}},{\frac {5}{11}},{\frac {13}{2\cdot 5}},{\frac {1}{5}},{\frac {2}{3}},{\frac {2\cdot 5}{7}},{\frac {7}{2}}\right)}
つまり
(
20
33
,
5
11
,
13
10
,
1
5
,
2
3
,
10
7
,
7
2
)
{\displaystyle \left({\frac {20}{33}},{\frac {5}{11}},{\frac {13}{10}},{\frac {1}{5}},{\frac {2}{3}},{\frac {10}{7}},{\frac {7}{2}}\right)}
は、2進 しん 記数 きすう 法 ほう におけるa のハミング重 おも み H(a )、すなわちa の2進数 しんすう 表記 ひょうき における1 の個数 こすう を計算 けいさん する。入力 にゅうりょく は2a で出力 しゅつりょく 13H(a ) である。[4] このプログラムを解析 かいせき すると以下 いか のようになる。
FRACTRAN命令 めいれい
State
State インジケータ
条件 じょうけん
アクション
次 つぎ のState
3
⋅
11
2
2
⋅
5
,
5
11
{\displaystyle {\frac {3\cdot 11}{2^{2}\cdot 5}},{\frac {5}{11}}}
A
v5, v11
v2 > 1
v2から2を引 ひ き、v3に1を加 くわ える
A
13
2
⋅
5
{\displaystyle {\frac {13}{2\cdot 5}}}
v2 = 1
v2から1を引 ひ き、v13に1を加 くわ える
B
1
5
{\displaystyle {\frac {1}{5}}}
v2 = 0
なし
B
2
3
{\displaystyle {\frac {2}{3}}}
B
None
v3 > 0
v3から1を引 ひ き、v2に1を加 くわ える
B
2
⋅
5
7
{\displaystyle {\frac {2\cdot 5}{7}}}
v3 = 0 かつ v7 > 0
v7から1を引 ひ き、v2に1を加 くわ える
A
7
2
{\displaystyle {\frac {7}{2}}}
v3 = 0 かつ v7 = 0 かつ v2 > 0
v2から1を引 ひ き、v7に1を加 くわ える
B
v2 = 0 かつ v3 = 0 かつ v7 = 0
停止 ていし する
^ Gödel numbering ゲーデル数 すう は、慣例 かんれい が適用 てきよう して、直接 ちょくせつ 負 まけ の整数 せいすう 、浮動 ふどう 小数点 しょうすうてん 数 すう や文字 もじ 列 れつ を間接 かんせつ 的 てき に表 あらわ すようにすることはできるが、直接的 ちょくせつてき に使用 しよう することはできない。FRACTRANに提案 ていあん されている拡張 かくちょう 機能 きのう にはFRACTRAN++ (Written in English) 及 およ びBag (Written in English) などがある。
^ Esolang FRACTRAN page (Written in English) に類似 るいじ した乗算 じょうざん 器 き のアルゴリズムの説明 せつめい がある。