« 怪我の功名 | メイン | 「のり」の計算方法は? »

2005年09月21日

ジャグリング可能な双子素数は存在するか

先日、9の6乗(3の12乗)を計算すると「531441」となって、偶然にも3ボールで有名なサイトスワップが2つ並ぶ形になっているのに驚きました。別にヒマで死にそうだから電卓を叩いていたというわけではありません。LISPという、ややマニアックなプログラム言語のサンプルとして実行していたコードを変形しているうちに、そんな値が出てきたというだけです。

で、習作のつもりで、いろいろと計算してみました。LISPの世界ではC言語で言う、isalphaのような文字検査関数のようなものは、alpha-pとかalphapと書く習慣になっています。zeroかどうかなら、zeropです。(zerop 0)は真を、(zerop 1)は偽を返します。なので、今回作った関数はjugglepです。(jugglep '(5 3 1))は真を返します。

ちなみに、LISPでは真偽値は0、1として表現されますが、それを示すシンボルとしては、trueやfalseといった他言語によくある英単語ではなく、謎めいたt、nilという文字列を使います。(zerop 0)はtを返します。LISPerの間で有名なジョークに、「coffeep?」という問いかけで始まるものがあります。coffeepは、「コーヒー飲む?」という意味に解釈されます。これに対して「うん」と答えようと思ったLISPerは「t(ティー)」と言ってしまう。LISPerは永遠にコーヒーが飲めず紅茶ばかり飲むことになる、というものです。

と、そんな冗談はさておき。ジャグリング可能な数字として、まず階乗を調べました。n! (n < 100)です。6!=720が最大のジャグリング可能な階乗でした。自明のものしか出てこなくて、ややガッカリですが、よく考えると、これは当たり前です。階乗は数字が大きくなるにつれ、下の桁にどんどんゼロが蓄積していくのでした。たとえば、50!=30414093201713378043612608166064768844377641568960512000000000000です。約数に5が含まれる数字をかけるたびにゼロが増えるので、こうなります。1000!は2560桁の数字になりますが、下248桁はゼロ行進です。

次にn^a(n<100,a<10)です。3^6=729や4^3=64といったシンプルなものをのぞくと、19^3=6859(7ボール)、96^3=884736(6ボール)といったものが出てきました。nとaを少しずつ大きくして、もう少し広い範囲で調べてみると、133^3=2352637(4ボール)、138^4=362673936(5ボール)、534^3=152273304(3ボール)、717^3=368601813(4ボール)などが見つかりました。どれも、3^12=531441のインパクトには、遙かに及びません。残念。

素数も調べてみました。10万以下の素数でジャグリング可能な数字は431個ありました。しかし、どれも取り立てておもしろくありません。53089、53147、53197、53453、53507、53633……、97423、97441、97577、97847、97883、97973、99089、99133などとなっています。

数字の並びをみていて、ふと双子素数はどうかなと思いました。双子素数というのは、p、p+2の形の素数で(17,19)、(41,43)など隣り合う奇数が両方素数という組みのことです。素数というのは簡単な証明で無限にあることがわかりますが、双子素数のほうは無限に存在するかどうかわかっていません。小学生にも問題の意味がわかるのに、肯定的にも否定的にも証明されていない未解決の難問です。そんなわけで、何となくジャグリング可能な双子素数探しというのは、楽しげな響きだと思ったのでした。

もう気づいている方もいるかもしれませんが、ジャグリング可能な最大の双子素数は、(71,73)で、3桁以上では存在しません……。双子素数は各桁の合計の差が当然2です。ボールの数と周期には、「(ボールの数)=(サイトスワップの合計値)÷(周期)」という関係がありますから、ボールの数が双方で1個違うようなn,n+2というのは3桁以上ではありえません。双子素数(41,43)を4143のように連続した数字に見立てても無理です。


それにしてもLISPは簡単に書けて楽しい。試行錯誤の計算に適した電卓のようです。調子に乗って状態数や状態間の遷移を計算するサイトスワップ方程式も、関数にしてしまいたくなってきました。と、サイトスワップの原理をわかったような口調で書いていますが、実は今回改めてサイトスワップを勉強したのでした。にしのさんの論文(「ジャグリングの連続技生成」(情報処理学会ゲーム情報学研究報告 2002-GI-7, pp. 17--23))が、とてもわかりやすくて勉強になりました。日本のジャグリング界では、サイトスワップの数理的側面の探求は一通り終わってしまったように見受けられますが、周回遅れでやってきたぼくには、とてもおもしろいです。サイトスワップは置換群を成していたのか! って、どういう意味ですか?(何

いろいろ試した関数のリストをアップしておきます。興味のある人は是非どうぞ。処理系はxyzzyというエディタを使いました。CommonLispの仕様をかなり満たしているらしいですが、よく知りません。ほかのCLISPな環境で動くのかとかも、全然わかりません。

;;; リストの要素の平均値を計算
(defun average (x)
  (/ (apply #'+ x) (length x)))

;;; 数値をバラして各桁の数字でリスト作る
(defun make-ss-list (ss)
  (let (ss-list '())
    (while (> ss 0)
      (setq ss-list
	    (append ss-list (list (mod ss 10))))
      (setq ss (/ (- ss (mod ss 10)) 10)))
    (reverse ss-list)))

;;; 与えられたリストがジャグリング可能か判定する
(defun jugglep (ss-list)
  (let ((s 0) (new-ss-list '()) (jugglable t))
    (if (integerp (average ss-list))
	(progn
	  (dolist (x ss-list new-ss-list)
	    (setq new-ss-list
		  (append new-ss-list
			  (list (mod (+ s x) (length ss-list)))))
	    (setq s (1+ s)))
	  (while (not (equal new-ss-list '()))
	    (if (member (car new-ss-list) (cdr new-ss-list))
		(progn
		  (setq jugglable nil)
		  (setq new-ss-list '())))
	    (setq new-ss-list (cdr new-ss-list)))
	  jugglable)
      nil)))

;;; 素数かどうかの判定
(defun prime-p (n k prime-list)
  (dolist (m prime-list)
    (cond ((zerop (mod n m)) (return))
          ((< k m) (return t)))))

;;; 素数のリストを作る
(defun prime (n)
  (do ((prime-list '(2))
       (m 3 (+ m 2)))
      ((< n m) prime-list)
    (if (prime-p m (sqrt m) prime-list)
        (setq prime-list (append prime-list (list m))))))

;;; 階乗計算
(defun fact (x)
    (if (zerop x)
        1
        (* x (fact (1- x)))))

;;; べき乗計算
(defun expo(a b)
  (if (= b 1) a  (* a (expo a (1- b)))))

;;; 実際の計算例1
(dotimes (n 100)
  (dotimes (a 100)
    (if (and (jugglep (make-ss-list (expo (1+ n) (1+ a))))
	     (> n 1)
	     (> a 1))
	(progn
	  (print (cons (1+ n) (1+ a)))
	  (print (cons "balls" (average (make-ss-list (expo (1+ n) (1+ a))))))
	  (print (expo (1+ n) (1+ a)))))))

;;; 実際の計算例2
(dolist (n (prime 100000))
  (if (jugglep (make-ss-list n))
      (print n)))

投稿者 ken : 2005年09月21日 11:16

トラックバック

このエントリーのトラックバックURL:
http://d-code.org/blog/mt-tb.cgi/151

コメント

あれは整理メモのようなもので何も新しいことが書いてないので、おはずかしい。穴があったら…

閑話休題。
いや、でも、すごいですね。!!!!
最初に言ってたのは9^6=531441ですが、今回のように
3^12=531441って書くと、実は左辺の312もジャグリング可能ですね。とても綺麗です。
より一般に
ab..c^d..f = wx..yz で、a..f, w..zともにジャグリング可能なもの、なんて探すのも楽しそうです。
桁数が増えると急激にジャグリング可能性が減りますから、結構少ないと思います。

投稿者 にしの : 2005年09月21日 19:25

コメントしてください




保存しますか?