FRACTRAN は、数学者ジョン・コンウェイによって発明されたチューリング完全な 難解なプログラミング言語です。FRACTRAN プログラムは、最初の正の整数入力nを伴う正の分数の順序付きリストです。プログラムは、次のように整数n を更新することで実行されます。
- リスト内のnfが整数である最初の分数fについては、 nをnfに置き換える
- リスト内の分数をn倍したときに整数にならないまでこの規則を繰り返し、その後停止します。
Conway 1987 は、連続する素数を見つける PRIMEGAME と呼ばれる次の FRACTRAN プログラムを提供しています。
このFRACTRANプログラムは、 n =2から始めて、次の整数のシーケンスを生成します。
- 2、15、825、725、1925、2275、425、390、330、290、770、...(OEISの配列A007542)
このシーケンスには、2 の後に次の 2 の累乗が含まれます。
(OEISの配列A034785)
これらの 2 の累乗の指数部分は素数、2、3、5 などです。
FRACTRAN プログラムを理解する
FRACTRAN プログラムは、レジスタが引数の素指数に格納されるレジスタ マシンの一種として考えることができます。
ゲーデル数を用いると、正の整数は任意の数の任意の大きさの正の整数変数をエンコードすることができる。[注 1]各変数の値は、整数の素因数分解における素数の指数としてエンコードされる。例えば、整数
は、1 つの変数 ( と呼ぶ) が値 2 を保持し、他の 2 つの変数 (および) が値 1 を保持するレジスタ状態を表します。他のすべての変数は値 0 を保持します。
FRACTRAN プログラムは、正の分数の順序付きリストです。各分数は、分母の素因数で表される 1 つ以上の変数をテストする命令を表します。例:
は、と をテストします。 かつ の場合、から 2 を減算し、 から 1 を減算し、 v3 に 1 を加算し、 に 1 を加算します。 例:
FRACTRAN プログラムは単なる分数のリストなので、これらのテスト-デクリメント-インクリメント命令は、FRACTRAN 言語で許可される唯一の命令です。さらに、次の制限が適用されます。
- 命令が実行されるたびに、テストされる変数も減算されます。
- 同じ変数を 1 つの命令で減分と増分の両方を行うことはできません (そうしないと、その命令を表す分数が最小の項にはなりません)。したがって、各 FRACTRAN 命令は、変数をテストするときにそれらを消費します。
- FRACTRAN 命令では、変数が 0 であるかどうかを直接テストすることはできません (ただし、特定の変数をテストする他の命令の後に配置するデフォルト命令を作成することで、間接的なテストを実装できます)。
簡単なプログラムの作成
追加
最も単純なFRACTRANプログラムは、次のような単一の命令です。
このプログラムは、次のような(非常に単純な)アルゴリズムとして表すことができます。
という形式の初期入力が与えられると、このプログラムは、などのシーケンスを計算し、最終的に、ステップ の後に 2 の因数がなくなり、 との積が整数にならなくなるまで計算します。その後、マシンは という最終出力で停止します。つまり、2 つの整数を加算することになります。
乗算
「加算器」を「ループ」することで「乗算器」を作成できます。これを行うには、アルゴリズムに状態を導入する必要があります。このアルゴリズムは数値を受け取り、次を生成します。
状態 B はを加算して に移動するループであり、状態 A は状態 B のループを 回繰り返す外部制御ループです。状態 A は、状態 B のループが完了した後、 の値をから復元します。
新しい変数を状態インジケータとして使用して状態を実装できます。状態 B の状態インジケータは、およびになります。1 つのループに 2 つの状態制御インジケータ (プライマリ フラグ ( ) とセカンダリ フラグ ( ) ) が必要であることに注意してください。各インジケータはテストされるたびに消費されるため、「現在の状態で続行する」ことを示すセカンダリ インジケータが必要です。このセカンダリ インジケータは次の命令でプライマリ インジケータにスワップバックされ、ループが続行されます。
乗算アルゴリズム テーブルに FRACTRAN 状態インジケーターと命令を追加すると、次のようになります。
FRACTRAN 命令を書き出すときは、状態 A 命令を最後に置く必要があります。状態 A には状態インジケータがないため、状態 A 命令を最後に置く必要があります。状態インジケータが設定されていない場合は、これがデフォルトの状態になります。したがって、FRACTRAN プログラムでは、乗数は次のようになります。
入力2 a 3 bに対してこのプログラムは出力5 abを生成します。[注 2]

引き算と割り算
同様の方法で、FRACTRAN「減算器」を作成し、減算を繰り返すことで、次のように「商と余り」アルゴリズムを作成できます。
FRACTRAN プログラムを書き出すと、次のようになります。
入力2 n 3 d 11は出力5 q 7 rを生成します。ここでn = qd + rかつ0 ≤ r < dです。
コンウェイの素数アルゴリズム
上記の Conway の素数生成アルゴリズムは、本質的には 2 つのループ内の商と剰余のアルゴリズムです。0 ≤ m < nの形式の入力が与えられると、アルゴリズムはn +1 をnから1 までの各数値で割り、 n +1の約数となる最大の数値k を見つけます。次に、2 n +1 7 k -1 を返して繰り返します。アルゴリズムによって生成される状態数のシーケンスが 2 の累乗を生成するのは、kが 1 のとき (つまり 7 の指数が 0 のとき) のみで、これは 2 の指数が素数である場合にのみ発生します。Conway のアルゴリズムのステップごとの説明は、Havil (2007) に記載されています。
このプログラムでは、素数 2、3、5、7... に到達するには、それぞれ 19、69、281、710、... のステップが必要です ( OEISのシーケンスA007547 )。
コンウェイのプログラムの変種も存在し、[1]これは上記のバージョンとは2つの点で異なります。
この変形は少し速く、2、3、5、7... に到達するには 19、69、280、707... ステップかかります ( OEISのシーケンスA007546 )。このプログラムを 1 回繰り返して、特定の数N が素数であるかどうかをチェックすると、次のステップ数がかかります。 ここで、はNの最大の整数約数で、は床関数です。[2]
1999年、デヴィン・キルミンスターはより短い10命令のプログラムを実証しました。[3] 初期入力n = 10に対して、連続する素数は10の累乗によって生成されます。
その他の例
次の FRACTRAN プログラム:
aの2進展開のハミング重みH( a )、つまりaの2進展開における1の数を計算します。[4]入力2aに対して、出力は13H ( a )です。プログラムは次のように分析できます。
注記
- ^ ゲーデル番号付けは、負の整数、浮動小数点数、またはテキスト文字列には直接使用できませんが、これらのデータ型を間接的に表現するための規則を採用することはできます。FRACTRAN の提案された拡張には、FRACTRAN++ と Bag があります。
- ^ 同様の乗算アルゴリズムは、Esolang FRACTRAN ページで説明されています。
参照
参考文献
- ^ ガイ 1983、p. 26; コンウェイ&ガイ 1996、p. 147
- ^ ガイ 1983、33 ページ
- ^ ハヴィル 2007、176 ページ
- ^ ジョン・バエズ、パズル#4、nカテゴリーカフェ
- ガイ、リチャード K. (1983)。「コンウェイの素数生成マシン」。数学雑誌。56 (1)。テイラー&フランシス:26–33。doi :10.1080/0025570X.1983.11977011。
- Conway, John H. (1987)。「FRACTRAN: 算術演算用のシンプルな汎用プログラミング言語」。通信と計算における未解決問題。Springer-Verlag New York, Inc. pp. 4–26。doi : 10.1007 / 978-1-4612-4808-8_2。ISBN 978-1-4612-9162-6。
- コンウェイ、ジョン H.; ガイ、リチャード K. (1996)。The Book of Numbers。Springer -Verlag New York, Inc. ISBN 0-387-97993-X。
- ハヴィル、ジュリアン(2007年)。困惑!プリンストン大学出版局。ISBN 978-0-691-12056-0。
- ロバーツ、シボーン(2015)。「美徳の基準」。天才の遊び - ジョン・ホートン・コンウェイの好奇心。ブルームズベリー。pp. 115–119。ISBN 978-1-62040-593-2。
外部リンク
- ジョン・コンウェイの講演:「Fractran: ばかげた論理言語」
- 「素数病理学:フラクトラン」
- Weisstein、Eric W.「FRACTRAN」。MathWorld。
- 素数病理学
- FRACTRAN - (エソラン ウィキ)
- Rubyの実装とサンプルプログラム
- プロジェクトオイラー問題308
- 「Fractran で Fizzbuzz をゼロから構築する」
- Chris Lomont、「FRACTRAN のユニバーサル FRACTRAN インタープリタ」
