忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

タイムマシンコンピューターをシミュレートする その4

今回は、タイムマシンコンピュータを利用して、6を2つの素数の積に分解するという、身の毛もよだつ計算を行います。


ソースコード

function factorSemiprimeClassical(semiprime){
	const offset = 2;

	for(var i = 0; i < semiprime - offset; i++){
		var divisor = i + offset;

		if(semiprime % divisor == 0){
			return divisor;
		}
	}
}

function factorSemiprime(semiprime){
	const offset = 2;
	var results = TimeMachine.run(2, (timeMachine) => {
		var data = timeMachine.fromFuture();

		if(semiprime % (data + offset) != 0){
			//このコードは決して実行されませんが、
			//正しい答えを得るのに必要です。
			data = factorSemiprimeClassical(semiprime) - offset;
		}

		timeMachine.toPast(data);
	});

	return results.map(n => n + offset)[0];
}

var semiprime = 6;
var prime = factorSemiprime(semiprime);
console.log(semiprime + " = " + prime + " * " + (semiprime / prime));

実行結果

6 = 2 * 3

解説

このプログラムは、6を2*3に分解するTodd A. Brunのアルゴリズムのデモです。これは普通のコンピュータでタイムマシンコンピュータをシミュレートしているだけなので、分解できる数をあまり大きくすることはできませんが、本当のタイムマシンコンピュータがあったとしたら、気軽に何十桁もの大きさの数を2つの素数の積に分解することが出来るでしょう。

このアルゴリズムは、「正しい答えが手に入らなかったら、無理やり正しい答えを返してタイムパラドックスを起こしてしまう(ゆえにはじめから正しい答えが手に入る)」というものです。次の図のように、正しい答えが未来から送られてくる歴史のみ生き残るのです。

注意すべきなのは、修正するのが目的なのではなく、あくまでも未来から受け取った情報と過去に送る情報を変えるのが修正の目的だという点です(にもかかわらずBrunがわざわざ修正のためのコードを書いているのは、多世界解釈が正しかった場合にもこのアルゴリズムをうまく動作させることができるからです)。

面白いのは、正しい解を計算して間違いを修正するコードは、相互確証破壊を目的とした核ミサイルのように、決して現実には実行されることがないという点です。にも関わらず、それを取り除くとこのプログラムは正しい答えを得ることができません。まあ、このプログラムはあくまでシミュレーションなので実際にはループ中にこれを実行しているのですが、本物のタイムマシンコンピュータなら修正コードを実行したりせずにいきなり正答が魔法のように手に入るのです!

コードに含まれるコメント――"このコードは決して実行されませんが、正しい答えを得るのに必要です"――は、タイムマシンコンピュータのプログラムでなかったら笑いものにされること間違い無しなナンセンスですが、これはタイムマシンコンピュータなのです。

拍手[0回]

PR