ピタゴラス数をなんと 〜荒らされたので立て直しました〜 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
自分で作ったプログラムでa^2+b^2のaが35万以上計算しました。 100万以上に向けて頑張りたいと思いますので 応援お願いいたします。 プログラムにバグがあった場合抜けている数があると思うので その点には留意いたしたいと思う次第であります。 >>161 > もし、字下げや、関数の呼び出しのようなスタイルに対するものでしたら、 > 染みついたものですから、しょうが無いですね。 いや、インデントに関しては、個人の趣味の問題なので「好きにしろ」 という立場なんだが、「変数を頭のところで宣言する」というのが わりと古いスタイルの C に影響されているかもな、と思った。 CPU のレジスタ構成とかを考えると、昔は高速化に貢献していた 部分はあるのだが、昨今のコンパイラの最適化は信用していいと 思う(不安だったら、C のコンパイラはアセンブラのソースを 吐くので、それを読んでみたら安心できると思う)ので、 変数のスコープを明確に示して、人間側のエラーを減らしたほうが、 (あくまで職業的なプログラマの立場から言うのであって、個人が 書くプログラムに関しては、ぶっちゃけ趣味の問題でしかないが) たぶん長期的にみると効率がいいと思う。 プログラマは「三日前の自分は他人だ」と云うしな。 あと、これは数学板で言うこっちゃないと思うが (つーても FORTRAN は「数式変換(FORmula TRAMsratpr)」の 略だし、「ALGOL」は、アルゴリズム記述用の言語として定義された 経緯はあるのだが)、 変数名として i, j, k を使うのは、i, j, k, l, m, n(たぶん integer から natural までだと思う)で始まる変数は、定義されていなくても整数型の 変数だ、という FORTRAN 60 の処理系依存のルールが起源だと思う。 昨今は「局所変数は、使うスコープの中で定義する」というスタイルが 一般的になっていると思う。 このあたり、哲学(論理学)における、自由変項(グローバル変数)と 束縛変項(局所変数。関数引数と、関数内の作業領域が、この代表)に 対応しているので、興味があったらこれらの言葉をキーワードとして 関連図書を漁ってみると楽しいかもしれない。 >>161 いきなり思い出したので書いておくと、 大田区の区議会選挙の話でシャープレイ=シュービック指数を 計算するときに、すべての組合せを生成する(もうちょっと 効率のいい計算法があるはずなんだが、考えるより動かしたほうが 早そうだった)ルーチンが必要になり、その昔書いた「動的ちり集め」の ロジックをひねくって実装した記憶があった。 ところが、Java には明示的なポインタがない(「参照」は実質的には ポインタなんだが)ので、swap ができなくてギブアップした経験がある。 そんなわけで、「とりあえず、整列やらなんやらはライブラリに任せて、 中身に関しては(よっぽど遅くなかったら)考えないことにする」と 居直った。 だから、昔の関数電卓を使うと、初等計算の計算より階乗の計算のほうが あからさまに遅いのを見ると、なんとなく諦念が浮かんでくる。 色々と面白いお話ありがとうございます。本論からは外れてしまいますが、少しコメント させてもらうと、FORTRAN、暗黙の宣言文ときたら、私はルンゲクッタ法を思い出してしまいます。 表記の異なる4つの式を、暗黙の宣言文を利用(悪用)して、1ステップの式で表し、 こっそりループに閉じ込めました。そして初見の人に、「これ、ルンゲクッタ法使ってるの?」と 言わしめる悪戯をしていたのを思い出します。 投票力指数については初めて目にしました。順列生成は、覆面算とかのパズル系でよくつかいますが、 このような実用的なところでも利用されていたんですね。勉強になりました。 >> プログラマは「三日前の自分は他人だ」と云うしな。 呂蒙のお話かと思ったけど、「自分が書いたはずの三日前のコードの意図が分からない」的なことですよね。 >>168 > そして初見の人に、「これ、ルンゲクッタ法使ってるの?」と > 言わしめる悪戯をしていたのを思い出します。 N88-BASIC には GOTO と GOSUB というコマンドがあって、 飛び先が両方ともラベルだった。 で、「八人の女王」のプログラムで GOTO と GOSUB と RETURN を ごっちゃに使って「追っているとだんだん意味不明になって頭を抱える」 というのを書いたことがある。 >>168 呂蒙って知らなかった。『男子、三日会わざれば刮目(かつもく)して見よ』 みたいな話じゃなくて、「喉元過ぎれば熱さを忘れる」とか「ニワトリは 三歩歩くと忘れる」程度の話。 ちなみに、ナメクジは思い出した瞬間に冷やすと忘れる、という話が あるので、「トラウマとかがあった場合、思い出した瞬間に冷やしたら どうだろう?」みたいな話が昔あった。 >>170 日経サイエンス、一九九〇年七月号、P.82、 『冷やすと消えるナメクジの記憶』。 なんかこのスレも決着がついちゃった感があるので、 残りを埋める意味で Java のソースでも貼っとくか。 「原始ピタゴラス数」という名前ではなく、 「縦横と対角線の長さが自然数で表される長方形」を 「バビロニア長方形」と呼んでいる。 クラス定義と、縦横の比のコンパレータ。コンテナに突っ込んで ソートすると、縦横比で整列される。 public class BabylonianRectangle { private int p; private int q; private int m; private int n; private int odd_side; // 奇数辺 private int even_side; // 偶数辺 private int short_side; // 短辺 private int long_side; // 長辺 private int diagonal; // 対角線 private int magnitude; // 倍率 private double aspect_ratio; // 形状比 /* * コンストラクタ * @param a * @param b */ public BabylonianRectangle( int a, int b ) { this.magnitude = Secretary.gcf(a, b); a /= magnitude; b /= magnitude; if ((a % 2 == 1) && ( b % 2 == 1)) { this.m = a; this.n = b; this.p = (n - m) / 2; this.q = (n + m) / 2; /* * Euclid の公式 * {(q^2 - p^2) / 2, p * q, (p^2 + q^2) / 2)} * ただし、p, q は互いに素であり、ともに奇数.。 */ this.even_side = (( this.n * this.n ) - ( this.m * this.m )) / 2; this.odd_side = this.m * this.n; this.diagonal = (( this.m * this.m ) + ( this.n * this.n )) / 2; } else { this.p = a; this.q = b; this.m = q - p; this.n = q + p; /* * Brahmagupta の公式 * {n^2 - m^2, 2 * m * n, m^2 + n^2} * ただし、m, n は 0 < m < n かつ * 互いに素であり、偶奇が異なる. * */ this.odd_side = (q * q) - (p * p); this.even_side = 2 * p * q; this.diagonal = (p * p) + (q * q); } // 短辺と長辺の長さを求める。 this.short_side = (odd_side < even_side) ? odd_side : even_side; this.long_side = (odd_side < even_side) ? even_side : odd_side; this.aspect_ratio = (double)long_side / (double)short_side; } /* * getter. 原則的に setter はない. */ // Euclid の公式 public int getM() { return this.m; } public int getN() { return this.n; } // Brahmagupta の公式 public int getP() { return this.p; } public int getQ() { return this.q; } // 奇数辺の長さ public int getOddLeg() { return this.odd_side; } // 偶数辺の長さ public int getEvenLeg() { return this.even_side; } // 短辺の長さ public int getShortSide() { return this.short_side; } // 長辺の長さ public int getLongSide() { return this.long_side; } // 対角線の長さ public int getDiagonal() { return this.diagonal; } // 形状比 public double getAspectRatio() { return this.aspect_ratio; } /* * 扱いが かなり面倒臭い. setter が必要. */ public int getMagniTude() { return this.magnitude; } @Override public String toString() { int x = this.getShortSide(); int y = this.getLongSide(); int z = this.getDiagonal(); float sort_key = (float)( z * z )/(float)( y * y ); String ret = "{" + Integer.toString(this.getShortSide()) + ", " + Integer.toString(this.getLongSide()) + ", " + Integer.toString(this.getDiagonal()) + "}:" + sort_key; return ret; } public String toString2() { String ret = "( p = " + this.getP() + ", q = " + this.getQ() + "):" + "( m = " + this.getM() + ", n = " + this.getN() + "):" + "{" + Integer.toString(this.getShortSide()) + ", " + Integer.toString(this.getLongSide()) + ", " + Integer.toString(this.getDiagonal()) + "}:" + this.getAspectRatio(); return ret; } } import java.util.Comparator; public class BabylonianRectangleComparator implements Comparator<BabylonianRectangle> { public int compare( BabylonianRectangle a, BabylonianRectangle b ) { if (a.getAspectRatio() == b.getAspectRatio()) return 0; if (a.getAspectRatio() > b.getAspectRatio()) return 1; return -1; } } >>128 以降の、プリンプトン322の話は以下のような 感じで確認できる。 import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import toybox.Abaci; public class P322_05 { // static final double phi = 1.732d;; static final double phi = (1.0d + Math.sqrt(5.0d)) / 2.0d; static final int UPPER_LIMIT = 180; public static void main( String [] args ) { _main(); } private static void _main() { ArrayList <BabylonianRectangle> BRs = new ArrayList<BabylonianRectangle>(); byEuclid(BRs); // byBrahmagupta(BRs); Collections.sort(BRs, new BabylonianRectangleComparator()); print(BRs); print2(BRs); } // ユークリッドの公式 static void byEuclid(ArrayList <BabylonianRectangle> brs) { for (int m = 1; m < UPPER_LIMIT; m += 2) { for (int n = m + 2; n <= UPPER_LIMIT; n += 2) { if (Secretary.gcf(m, n) != 1) continue; BabylonianRectangle br = new BabylonianRectangle(m, n); if ((1.0d < br.getAspectRatio()) && (br.getAspectRatio() < phi)) { if (Secretary.isHarmonic(br.getLongSide())) { brs.add(br); } } } } } // ブラーマグプタの公式 static void byBrahmagupta(ArrayList <BabylonianRectangle> brs) { for (int p = 1; p < UPPER_LIMIT; p += 1) { for (int q = p + 1; q <= UPPER_LIMIT; q += 2) { if (Secretary.gcf(p, q) != 1) continue; /* if (!Secretary.isHarmonic(p)) continue; if (!Secretary.isHarmonic(q)) continue; */ BabylonianRectangle br = new BabylonianRectangle(p, q); if ((1.0d < br.getAspectRatio()) && (br.getAspectRatio() < phi)) { if (Secretary.isHarmonic(br.getLongSide())) { brs.add(br); } } } } } static void print( ArrayList <BabylonianRectangle> BRs ) { int n = 0; Iterator <BabylonianRectangle> iter = BRs.iterator(); while ( iter.hasNext()) { BabylonianRectangle br = iter.next(); System.out.println(++n + " : " + br.toString()); System.out.println( Abaci.regulerNumberToString(br.getLongSide())); } } static void print2( ArrayList <BabylonianRectangle> BRs ) { int size = BRs.size(); if (size < 1) return; int index = 0; BabylonianRectangle work = BRs.get(index); float arx = (float) work.getAspectRatio(); for (index = 1; index < size; index += 1) { work = BRs.get(index); float ary = (float) work.getAspectRatio(); System.out.println(index + ":" + (ary - arx) * 100); arx = ary; } } } いくらか足らんところもあるけど、 なんかレスがついたら返事する予定。 でもって適当に age てみる。 参考までに、プリンプトン322に書かれている値を載せておこう。 夏休みの自由研究的なナニカだと思ってくれ。 番号 : {短辺, 長辺, 斜辺} : 六十進表記の斜辺の平方と長辺平方の比(同、十進表記) 1 : {119, (120,) 169} : 01;59:00:15(≒ 1.9834027) 2 : {3367, (3456,) 4825} : 01;56:56:58:14:50:06:15(≒ 1.9491584) 3 : {4601, (4800,) 6649} : 01;55:07:41:15:33:45(≒ 1.9188021) 4 : {12709, (13500,) 18541} : 01;53:10:29:32:52:16(≒ 1.8862479) 5 : {65, (72,) 97} : 01;48:54:01:40(≒ 1.8150077) 6 : {319, (360,) 481} : 01;47:06:41:40(≒ 1.7851928) 7 : {2291, (2700,) 3541} : 01;43:11:56:28:26:40(≒ 1.7199837) 8 : {799, (960,) 1249} : 01;41:33:45:14:03:45(≒ 1.6927094) 9 : {481, (600,) 769} : 01;38:33:36:36(≒ 1.6426694) 10 : {4961, (6480,) 8161} : 01;35:10:02:28:27:24:26:40(≒ 1.5861225) 11 : {45, (60,) 75} : 01;33:45(≒ 1.5625) 12 : {1679, (2400,) 2929} : 01;29:21:54:02:15(≒ 1.4894168) 13 : {161, (240,) 289} : 01;27:00:03:45(≒ 1.4500173) 14 : {1771, (2700,) 3229} : 01;25:48:51:35:06:40(≒ 1.4302388) 15 : {56, (90,) 106} : 01;23:13:46:40(≒ 1.3871605) >>182 120 / 119 = 1.008(1) 90 / 56 = 1.607(15) φ = 1.618 なんで、1 と 黄金比の間だって気がつかなかったのか、 そっちの方が不思議に思うんだがなぁ。 前にも書いたけど、 「11 番と 15 番が、なぜ原始ピタゴラス数ではないのか?」 っちゅーあたりを考えると、古代バビロニア人の 「美学」みたいなものに行き当たるので、 けっこう面白い。 …… というような話を、きょう 室井和男著/中村滋コーディネートの 『シュメール人の数学 ― 粘土板に刻まれた古の数学』 (共立出版。スマート・セレクション)の感想として 送っておいた。 反応が楽しみなんだが、結果は どうだろう。 思考停止の総当たり #include<stdio.h> #include<stdlib.h> int pit(int A,int B, int C){ int a,b,c; int pit=0; for(a=1;a<=A;a++){ for(b=a;b<=B;b++){ for(c=b;c<=C;c++){ if((a<b) && (a*a+b*b==c*c)) { ++pit; printf("%d : %d * %d + %d * %d = %d * %d\n",pit,a,a,b,b,c,c); } } } } return 0; } int main( int argc, char *argv[] ){ int a,b,c; a = atoi(argv[1]); b = atoi(argv[2]); c = atoi(argv[3]); pit(a,b,c); return 0; } >>187 おれも同じことをやったが、 演算子 ++ は、「構造体とかのサイズのあるものに 対するポインタに対して、sizeof() 分だけインクリメント するのが本来の使い方」なんで、ポインタじゃない 整数値に対しては ++ じゃなくて +=1 を使うのが 礼儀正しい C プログラミングのありかただと思われ。 >>187 あと、これはまったく余計な話だが、 main() の戻り値は、昨今は void に しとくのが流行らしい。 どうせレジスタに残ってる値を使うか使わないかの 話なんで、「どうでもいいや」っちゅー話はあるんだけどね。 プリンプトン322が45° から30° までの表だとすると、 {175, 288, 337}:1.369225 が入って 16 行になんないとおかしいと思うんだが、 どうだろう。 288 / 175 < √3 = 1/tan(30°) だよなぁ? すまん。別スレの話題なんだが、そっちの方では スレ違いなんで、「ピタゴラス数つながり」で、 このスレの残りを有効利用させてもらいたい。 m(_ _)m まず、「ユークリッドの公式」(つーても、ユークリッドが 生まれる千五百年前には発見されていたのだが)という ものがある。 【ユークリッドによる、原始ピタゴラス数の公式】 「互いに素な奇数 p, q (ただし、0 < p < q)から、一意に 原始ピタゴラス数を求める式がある。すなわち、 {X, Y, Z} = {(q^2 - p^2}/2, p×q, p^2 + q^2} である。」 つぎに、Barning = Hall = 亀井の定理について説明する。 互いに素な奇数 {p, q} (ただし、0 < p < q)があったとき、 以下の三つの奇数の組 は、互いに素であり、すべて異なる。 1){p, q + 2p} 2){q, p + 2q} 3){2q - p, q} 【Barning = Hall = 亀井の定理】 すべての原始ピタゴラス数は、三分木によって、一意に表される。 【Barning = Hall = 亀井の定理の逆問題】 任意の原始ピタゴラス数から、最小の原始ピタゴラス数に 至る経路を求めるアルゴリズムを示せ。 【解】 前期(1)(2)(3)は、逆操作として、 0 < p < q のとき、 {p', q'} = {p, |q - 2q|} として表される。 ただし、p = 1, q = 3 のとき、 p' = q' = 1 となり、「0 < p < q 」の条件を満たさないため、 逆操作は行えない。このとき、 f(1, 3) = {3, 4, 5} であり、Barning = Hall = 亀井の定理の示すところと 一致する。 この分野はよく知らないが、HallはMath GazzetteのClassroom Notesに Barningはオランダ語のレポートと、主流の結果でもない 最近の論文見ると http://nntdm.net/volume-18-2012/number-1/49-57/ みたいなのに掲載されてる。 あとは日本国内の研究者でBarning-Hallに興味持っている研究者を 調べて、そこの欧文紀要があれば掲載を頼む 英語で数学論文を書いた経験があまりないのなら 誰かに論文見てもらって直してもらわないと、論文の体裁をなしてないという理由で rejectくらっても仕方ないよ へぼい国内紀要でもそういう論文は結構投稿されていて門前払いを食らう 論文の校正まで編集部やrefereeはやってられないからね >>194 ありがとう。 「やべぇ! 後追いだったか?」と思って ちょっとビビったけど、 このレベルだったら細矢先生のほうが先に行ってる。 つーか出たのが二〇一四年の十月だったら、おれらがもう 逆問題を解いた後だ。 やっぱ、行列式使って解こうとすると、逆行列を考えたところで 行き詰まっちゃうんだろうな。おれらは そっちへ行ってないから、 どこで行き詰まるのか自体がよく解らんけど。 ついでに指摘しておくと、結城浩さんや紹介してくれた論文で 使ってる公式(こっちの方が有名だ)は、インドのプラーマグプタ (0の発見者として有名)が書き残してるもので、 時代的にはユークリッドの式よりも何百年か遅いはず。 >>191 以降の議論は、そっちの式を使っても、同じ結論に なる。p, q と m, n は、たしか和差の関係になるはず。 おれがプラーマグプタの式を使わなかった理由は、数式を 図で描こうと思うとダサいからだ(笑) ユークリッドの式は、長方形の中に三角形一つと長方形 一つで描ける(なんせ、古代バビロニアには数式がねぇ!) ので、壁に貼っておきたくなるようなシロモノだ。 (1)『すべての原始ピタゴラス数は、{3, 4, 5} に U/D/A という三次の行列を掛けることで、一意に表される』 という性質を既知とする。 e=(3 4 5)とする(横表記だけど縦ベクトルのつもり)。 v=(x y z)を原始ピタゴラス数とする。 (1)によれば、eにU/A/Dを掛け算していくことでvが得られるので、 U^{-1}v, A^{-1}v, D^{-1}v のうち、原始ピタゴラス数が少なくとも1つはある。 >>195 おぉ、ありがとう。 とりあえず敷居が高いというのは理解したので、 小冊子を自費で出版して(マンガ同人誌と おんなじようなモンだし)、心当たりに 片っ端から配って回る、とかいうのが いちばん手っ取り早いかもしらんな。 ここで、U^{-1}vとA^{-1}vがともに原始ピタゴラス数になることはない。 なぜなら、もしこの2つが原始ピタゴラス数なら、 U^{-1}vとA^{-1}vそれぞれに(1)を適用して、 eにU/A/Dを掛け算していくことでU^{-1}vが得られる eにU/A/Dを掛け算していくことでA^{-1}vが得られる ので、 eにU/A/Dを掛け算してU^{-1}vを得たのちに、さらにUを掛ければ v が得られる eにU/A/Dを掛け算してA^{-1}vを得たのちに、さらにAを掛ければ v が得られる となり、eからvへの経路が2つあることになって、(1)の一意性に矛盾する。 同じようにして、U^{-1}vとD^{-1}vがともに原始ピタゴラス数になることはないし、 A^{-1}vとD^{-1}vがともに原始ピタゴラス数になることはない。 要するに、U^{-1}v, A^{-1}v, D^{-1}v のうち、原始ピタゴラス数は1つしかない。 よって、以下のアルゴリズムで、vからeへのルートが出力できる。 v=(x y z)を原始ピタゴラス数とする。U^{-1}v, A^{-1}v, D^{-1}v を計算する。 この中に、原始ピタゴラス数がちょうど1つだけあるので、それに対して同じ作業を繰り返す。 有限回の作業でeに辿り着くので、ここまでの経路を出力すればよい。 eに合計でm個のU/A/Dを掛け算してvに辿り着くなら、>>200 のアルゴリズムでは 行列の積の計算が3m回必要になる。また、(x y z)が原始ピタゴラス数であるかどうかの判定には、 「x,y,zが負になってないか」「x,y,zに共通の因数がないか」を判定しなければならない。 前者は簡単に判定できる。後者はユークリッドの互除法で判定すれば高速に終わる。 (あるいは、U^{-1},A^{-1},D^{-1}の性質上、前者しか起きないのかも?) 全体としては、このようなアルゴリズムだけでも普通に速いんじゃないかという気がする。 たぶん、この分野ではもっと凄まじいアルゴリズムが希望されているのだろう。 次に、>>191-193 のやり方だが、記述を端折りすぎていてよく分からない。 エスパーすると、たぶんこういうことを言いたいのだと思う。 v=(x y z)を原始ピタゴラス数とする。 x=(t^2 - s^2)/2, y=s×t, z=s^2 + t^2 となるような、 互いに素な奇数0<s<tを求める。いつでもこのようにすると、 原始ピタゴラス数は「互いに素な奇数0<s<t」に対応することになる。 すると、>>191-193 によれば、U^{-1}v, A^{-1}v, D^{-1}v を計算することは、 互いに素な奇数0<s<tを用いて (1) 0<s<t−2s (2) 0<t−2s<s (3) 0<2s−t<s を計算することと同じことになるらしい(この順番で対応しているかは知らないが)。 sを基準にして書き換えると、(1),(2),(3)は s∈(0,t/3) s∈(t/3,t/2) s∈(t/2,t) と同じになる。最初に与えられているのは0<s<tつまりs∈(0,t)だから、 上の3つのうち2つ以上が同時に起きることはない。また、3つそれぞれが U^{-1}v, A^{-1}v, D^{-1}v のどれかに対応している(らしい)。 よって、>>191-193 のアルゴリズムは、たぶん次のようになるのだろう。 v=(x y z)を原始ピタゴラス数とする。 x=(t^2 - s^2)/2, y=s×t, z=s^2 + t^2 となるような、 互いに素な奇数0<s<tを求めておく。このとき、 (1) 0<s<t−2s (2) 0<t−2s<s (3) 0<2s−t<s のうち2つ以上が成り立つことはないので、成り立つものは高々1つである。 もし成り立つものがあったら、それを 0<s'<t' として、今までの操作を繰り返す。 (1)〜(3)のどれもが成り立たなくなったら、その時点で e=(3 4 5) に対応しているので、 そこでやめる。ここまでの過程で、(1)〜(3)のうちどれが成り立ってきたのかという履歴が U^{-1},A^{-1},D^{-1}の経路にきれいに対応している(らしい)ので、この履歴を出力すればいい。 これでいいのかは知らないが、もしこれでいいなら、 >>191-193 のアルゴリズムはとても速いし、面白いと思う。 で、速いし面白いことは大体わかったが、 ・ この程度なら、この界隈の人がとっくに見つけてたのではないか? ・ たとえば、>>194 の論文で全く同じことやってないか? という疑問点が生じる。 >>196 方法論として優れているのだろうと思うが 逆問題自体が解決されているとしたら、自分たちの手法の どこが優れているか明確に書かないといけない 学術論文を書く基本的な訓練を受けてないように感じる >>198 普通ならarXivに載せておくと良いでしょう 後から誰かとかち合っても記録に残る 次は、「番号」、「原始ピタゴラス数」、「p,q値」を列挙するプログラムです。 http://codepad.org/UhYptqy2 「番号」というのは、私が、原始ピタゴラス数の整理に便利だと考え、勝手につけた通し番号です。 (>>119 でアップした、http://codepad.org/VKGibeHo にちょっと手を加えただけのものです) この「番号」は、三分木構造のどの位置にあるのかを知るのに、便利な指標となっています。 番号に1を加え、3で割って切り捨てすれば、親の番号が判ります。 番号に1を加え、3で割った余りを求めれば、子の枝順位、つまり、長男(=0)、次男(=1)、三男(=2)を判定できます。 簡単に説明すると、番号1が始祖です。その子供が、2,3,4で、2の子供が5,6,7、3の子供が8,9,10、 4の子供が11,12,13、5の子供が、14,15,16、...となっています。 1が第一世代、2,3,4が第二世代、5〜13が第三世代で、14〜40が第4世代、、、(3^(n-1)+1)/2〜(3^n-1)/2 が第n世代 です。 簡単な構造なので、このような樹形図を初めて扱う方でも、各原始ピタゴラス数が、三分木構造のどこに配置されているか 簡単に図示できるでしょう。 この原始ピタゴラス数樹形図を、(p,q)の視点で眺めると、親を(p,q)としたとき、(p,2p+q)が長男、(q,2q-p)が次男、 (q,2q+p)が三男に相当しているようですね。 親のpq値(p',q')から、三人の子のpq値(p,q)を求める方法は、 (p,q)=(p',2p'+q'),(q',-p'+2q'),(q',p'+2q') それぞれ、長男、次男、三男に相当 子供のpq値(p,q)から、親のpq値(p',q')を求める方法は (p',q') =(p,q-2p) (3p<q の時;長男→親の変換に相当) =(2p-q,p) (p<q<2p の時;次男→親の変換に相当) =(-2p+q,p) (2p<q<3p の時;三男→親の変換に相当) ですね。 >>193 では >> {p', q'} = {p, |q - 2q|} として表される。 のようにされていますが、この場合、変換時、p',q'の大小をチェックして、 小さい方をp'、大きい方をq'としなければなりません。 しかし、変換式をここで書いたように固定すると、 p<q ⇔ p'<q' が成立しますよ。 >>202 >>203 >>204 問題の本質を理解してくださってありがたいが、 そんなに難しいことは言ってないんだ (^_^!) 二つの互いに素な奇数 p, q (0 < p < q)があるとすると、 そこから原始ピタゴラス数 { x, y, z } が求まる。x と y が 決まれば z も決まるので、本質は x, y。 で、奇数のほうが pq、偶数のほうが (q^2 - p^2) /2 だから、 {x, y} から p, q が求まる。 ここで、p × q の長方形を考えて、そこから p × p の正方形を 二個取り去る(面積が 1 になったらそこで終わり。マイナスに なった場合は「面積の絶対値」を取る)と、p' と q' が出て、 そこから原始ピタゴラス数を計算すると、それが「親」にあたる 原始ピタゴラス数になる。 ピタゴラス数を、「直角三角形の三辺」と考えるより、 「縦横と対角線の長さが自然数の比で表される長方形」 と考えたほうが素朴だろう(だいたい、日常で直角三角形と いうのはほとんど見ないし)、というのが出発点。 あとは、「互除法と連分数は、同じ概念の二つの側面」 であって、1 + √2 = [2; 2, 2, 2, 2, …]、 φ = [1; 1, 1, 1, 1, …] なんで、 プリンプトン322が計算しているのはこのあたり、 みたいな話につながってく。 >>207 見てますよー。 連分数にしろ図的解法にしろ、あまり一般的な 手法とはいえないので、現在広く使われている 基本の手法とか考え方とかとの相性がよいと 思います。数学をちゃんとやってる人に してみたら、「こっちの方がわかりやすい」 と思うんじゃないかな。 >>205 じつは、そのあたりはあんまり気にしてないんだ (^_^) もともと、本筋は「プリンプトン322の解読」のほうなので、 「ひょっとしたら、三千八百年くらい前に、バーニングとホールの 定理を見つけてたんじゃないか?」と思ってる。 だけど、室井和男さんという「塾講師(数学)でシュメール学者」 の方が「プリンプトン322を完全解読!」と宣言して いらっしゃったのね。で、「くそぅ、先を越されたか!」と 思ってたんだけど、最近になって、その室井さんの解読結果に 穴があったと知ってしまったので、「よし、勝ったぜ!」と 思ったのよ。 だけど、どこに発表したらいいのか分からんのよ。『数学セミナー』? 『日経サイエンス』?『子供の科学』?『ムー』? で、いま 途方に暮れているところ。 >>205 > この程度なら、この界隈の人がとっくに見つけてたのではないか? おれもそう思ったんだが、ラプラス変換みたいに「いっぺん別の 世界に行って、また戻ってくる」というラプラス変換みたいな やり口は、物理屋や工学屋のやりそうな手法で、昨今の数学屋さんには 不得手なんじゃないか?と思った。だから、そっち方面で独立に 見つけてる人は たぶんいる。 > たとえば、>>194 の論文で全く同じことやってないか? ・偶数辺と奇数辺があり、斜辺(対角線)は奇数 ・偶数辺は4の倍数 ・斜辺は ≡ 1(mod 4) ・偶数辺×奇数辺×斜辺は 60 の倍数 あたりで手詰まりになってる。自分でも引っかかったので、 英語だけど風情はよくわかる。 「奇素数が出るとするなら、どこに出るか?」とか 「(m, n で表したときに)奇数辺が平方数の和差になってる ところから、何か掴めないか?」とかスケベったらしい コトを考えると、だいたい捕まるというのが体験的に 謂える。 まぁ、原始ピタゴラス数のことだけを考えると簡単なんだが、 「平方数の和差と素因数分解の関係」とか考えると、 そっちの方へ行きたくなる気持はよくわかる。 >>191-193 について。 互いに素な奇数0<s<tを任意に取る。 v_{s,t}=( (t^2 - s^2)/2, st, (s^2 + t^2)/2 ) (横表記だけど縦ベクトルのつもり) と置くと、v_{s,t}は必ず原始ピタゴラス数である。逆に、(x y z)を原始ピタゴラス数とする。 このとき、(x y z)=v_{s,t}となるような、互いに素な奇数0<s<tが一意的に存在する。 Barning-HallのU/A/Dとv_{s,t}の関係について。 互いに素な奇数0<s<tに対して、s∈(0,t)が成り立つので、 s∈(0,t/3)またはs=t/3またはs∈(t/3,t/2)またはs=t/2またはs∈(t/2,t) のいずれかが成り立つ。すなわち、 (1) 0<2s−t<s (2) 0<t−2s<s (3) 0<s<t−2s (4) s=t/3またはs=t/2 のうち、1つだけが成り立つ。 (1)のとき、0<2s−t<sは互いに素な奇数である。 (2)のとき、0<t−2s<sは互いに素な奇数である。 (3)のとき、0<s<t−2sは互いに素な奇数である。 (1)が成り立つとき、U^{-1}v_{s,t}=v_{2s-t,s} が成り立つ(左辺を計算するだけ)。 (2)が成り立つとき、A^{-1}v_{s,t}=v_{t-2s,s} が成り立つ(同上)。 (3)が成り立つとき、D^{-1}v_{s,t}=v_{s,t−2s} が成り立つ(同上)。 (4)が成り立つとき、もしs=t/2なら、2s=tとなるので、tが奇数であることに矛盾する。 よって、s=t/3となる。このとき3s=tなので、s,tが互いに素であることから、 s=1となり、よってt=3となる。このとき、v_{s,t}=(4 3 5) となり、 これは最小の原始ピタゴラス数である。 >>216-218 を踏まえると、こちらがエスパーした>>204 のアルゴリズムは、 実際にこのアルゴリズムで正しいことが分かる。 そして、このアルゴリズムは確かに高速だ。行列の積を計算しなくても、 U^{-1}v_{s,t}=v_{2s-t,s} A^{-1}v_{s,t}=v_{t-2s,s} D^{-1}v_{s,t}=v_{s,t−2s} によって、vの添え字s,tの単純計算だけで済んでしまう。とても面白い。 だが、s,tの単純計算の計算量を行列の積の場合と比べてみると、 パラメータの桁数に関するオーダーとしては、定数倍の差しかないことが 分かった(次からのレスで書くが)。なので、オーダーの観点からは、 行列の積を計算してもs,tで計算しても同じオーダーになってしまう。 まず、>>200 のアルゴリズムの効率について。当初の>>201 では >(あるいは、U^{-1},A^{-1},D^{-1}の性質上、前者しか起きないのかも?) と書いたが、2s-tやt-2sが負の場合も含めて U^{-1}v_{s,t}=v_{2s-t,s} A^{-1}v_{s,t}=v_{t-2s,s} D^{-1}v_{s,t}=v_{s,t−2s} を考察すると、実際に前者しか起きないことが分かる。 なので、>>200 のアルゴリズムの効率は、>>201 から次のように改良できる。 eに合計でm個のU/A/Dを掛け算してvに辿り着くなら、>>200 のアルゴリズムでは 行列の積の計算が3m回必要になる。また、(x y z)が原始ピタゴラス数であるか どうかの判定には、「x,y,zが負になってないか」を判定するだけでよい。 では、行列の積の計算1回にかかる計算量と、 x,y,zが負になってないか判定するのにかかる計算量は、 それぞれどうなっているか。 v=(x y z)を原始ピタゴラス数とする。x,y,zそれぞれを2進法で表したときの桁数のうち 最大のものをn_{x,y,z}と表す。zの桁数が一番大きいので、実際にはzの桁数がn_{x,y,z}である。 次に、U^{-1},A^{-1},D^{-1}の成分は±1,±2,±3しかないので、(x y z)にU^{-1},A^{-1},D^{-1}を 掛け算すると、n_{x,y,z}の定数倍の計算量にしかならない。 よって、行列の積1回の計算で、n_{x,y,z}の定数倍の計算量にしかならない。 また、「x,y,zが負になってないか」の判定は上位1ビットを見ればいい(そこが符号の役目を している処理系なら)ので、これは定数時間で終わる。よって、>>200 のアルゴリズムを 1操作分やると、n_{x,y,z}の定数倍の計算量にしかならない。 よって、>>200 のような普通のアルゴリズムの時点で、かなり効率がよいと言える。 次に、>>204 のアルゴリズムの効率について。 (x y z)=v_{s,t}と表して、s,tに対して操作を行うのだから、 n_{s,t}に対する計算量を考えればよい。 (1) 0<s<t−2s (2) 0<t−2s<s (3) 0<2s−t<s しかないので、実質的にはt−2sだけ計算すればよい、これはn_{s,t}の定数倍の計算量で終わる。 n_{s,t}は、sとtの桁数のうち最大のものを表しているが、s<tだから、実際にはtの桁数がn_{s,t}である。 また、x=(t^2−s^2)/2, y=st, z=(s^2+t^2)/2 なので、t^2/2<z<t^2 が成り立つ。 よって、2n_{s,t}−2≦n_{x,y,z}≦2n_{s,t}となることが分かる。 よって、n_{s,t}=n_{x,y,z}/2, n_{x,y,z}/2−1 である。 よって、n_{x,y,z}を基準にしても、t−2sの計算はn_{x,y,z}の定数倍の計算量で終わる。 >>200 では、(x y z)→(x' y' z')→(x'' y'' z'')→… という形でピタゴラス数そのものを変形していくが、 >>204 では、v_{s,t}→v_{s',t'}→v_{s'',t''}→… としてs,tの方を変形していく。 一番最初は、v_{s,t}=(x y z)という関係がある。操作1回のあとの (x' y' z')とv_{s',t'}については、v_{s',t'}=(x' y' z')という関係がある。 操作1回のあとの(x'' y'' z'')とv_{s'',t''}については 、 v_{s'',t''}=(x'' y'' z'')という関係がある。・・・ このように、>>200 と>>204 では、各ステップで同じ対象について計算が進んでいて、 各ステップで ”n_{s,t}=n_{x,y,z}/2, n_{x,y,z}/2−1”の関係式が成り立つ。 よって、>>200 と>>204 は、処理全体が終わるまで見ても 定数倍の違いしかないことになるので、オーダーとしては同じになってしまう。 もちろん、定数倍の部分は>>204 の方がずっと小さいので性能が良いと言えるが、 オーダーの観点からは定数倍の差でしかない。 当初の話は、 「行列の積で逆問題を考えると有効な手立てがなくて 未解決問題だったが、連分数や図形で考えると効率よく解決する」 という話だったはず。しかし、行列の積で逆問題をやってる>>200 でも、 v_{s,t}のs,tに対する単純計算だけで終わっている>>204 でも、定数倍の違いしか 効率が変わらないので、行列の積で不満があるなら>>204 でも不満があるはずだし、 逆に>>204 で満足なら行列の積の>>200 でも満足のはず。 「>>200 では不満だが>>204 なら満足」という立場を維持するには、 定数倍の部分がとても小さいから>>204 で満足、と考えるしかない。 実務で使いたい人ならそういう立場でもいいのだが、 あくまでも理論的な未解決問題として考えたときには、 定数倍の違いしかないアルゴリズムを未解決問題だったとは普通は言わないので、 結局、この手の話で何かが未解決だったというのは考えにくい。 今も未解決のまま残っている問題は実際に存在するのかもしれないが、 少なくともこの話が未解決だったわけではないと思う。 そろそろ連投規制に引っかかる予感。 次に、v_{s,t}ではなく、別の公式を使った場合の>>204 について。 互いに素かつ偶奇の異なる正整数0<s<tに対して w_{s,t}=( t^2 - s^2, 2st, s^2 + t^2 ) と置くと、w_{s,t}は必ず原始ピタゴラス数である。逆に、(x y z)を原始ピタゴラス数とする。 このとき、(x y z)=w_{s,t}となるような、互いに素かつ偶奇の異なる正整数0<s<tが一意的に存在する。 v_{s,t}よりもこっちの方が有名な気がする。 Barning-HallのU/A/Dとw_{s,t}の関係について。 互いに素かつ偶奇の異なる正整数0<s<tに対して、s∈(0,t)が成り立つので、 s∈(0,t/3)またはs=t/3またはs∈(t/3,t/2)またはs=t/2またはs∈(t/2,t) のいずれかが成り立つ。つまり、 (1) 0<2s−t<s (2) 0<t−2s<s (3) 0<s<t−2s (4) s=t/3またはs=t/2 のうち、1つだけが成り立つ。 (1)のとき、0<2s−t<sは互いに素かつ偶奇の異なる正整数である。 (2)のとき、0<t−2s<sは互いに素かつ偶奇の異なる正整数である。 (3)のとき、0<s<t−2sは互いに素かつ偶奇の異なる正整数である。 (1)が成り立つとき、U^{-1}w_{s,t}=w_{2s-t,s} が成り立つ(左辺を計算するだけ)。 (2)が成り立つとき、A^{-1}w_{s,t}=w_{t-2s,s} が成り立つ(同上)。 (3)が成り立つとき、D^{-1}w_{s,t}=w_{s,t−2s} が成り立つ(同上)。 (4)が成り立つとき、もしs=t/3なら、3s=tとなるので、s,tの偶奇が一致してしまい、矛盾する。 よって、s=t/2となる。このとき2s=tなので、s,tが互いに素であることから、s=1となり、 よってt=2となる。このとき、w_{s,t}=(3 4 5) となり、これは最小の原始ピタゴラス数である。 よって、w_{s,t}を使っても、>>204 と同じアルゴリズムが成り立つ。 計算した感触からすると、原始ピタゴラス数を2つの変数で表す公式が得られるたびに、 その公式に対応した>>204 のアルゴリズムが必ずあるような予感がする。 >>144 にて私は、全てのピタゴラス数は、単位円上の一つの有理点に対応し、その有理点は 一つの有理数に対応可能だと言うことを指摘しました。 ピタゴラス数を探すと言うことは、有理数を探すことと同値です。 また、偶然にも私は、>>149 にて、「ユークリッドの互除法」は、 「(a と b の公約数)=(a と a-b の公約数) の積み重ねだ」とも指摘しました。 通常ユークリッドの互除法は最大公約数を見つける方法と認識されますが、最大公約数が1 だということになれば、「互いに素」であることを示す道具にもなります。 Mr.Motoさんの >>{p', q'} = {p, |q - 2q|} という変換は、pとqの最大公約数を求めるための、途中計算と考えることができます。 その際利用しているのは、「(a と b の公約数)=(a と a-b の公約数)」という内容。 ただし、これを、一歩ずつではなく二歩ずつ行っていると、考えるのです。 このようにして、(1,3)へ到達したならば、元々の奇数の組み合わせ(p,q)は、互いに素だったことを意味し、 同時にそれに対応する原始ピタゴラス数を表す有理数、指標となります。 このチェックの際辿った、(p,q)の変換経路は、ピタゴラス数を三分木構造に当てはめたときの、 樹形図上の経路そのものです。 親の方へ向かう変換は、最大公約数の計算or互いに素かどうかのチェックであり、 子の方へ向かう変換は、有理数の探索 or 作成に相当します。 ただ、2段飛びなので、全ての有理数を網羅することはできません。 分母分子とも奇数の場合しか回れませんから。 しかし、「ピタゴラス数の探索」という意味では、(奇数、奇数)の組み合わせだけで必要十分です。 一組のピタゴラス数に対応する単位円上の有理点は実は二つあります。(例:(5/13,12/13)と(12/13,5/13)) その有理点に対応する有理数は、一方は分母分子が両方とも奇数だし、もう一方は分母分子が、 偶数奇数混合型だからです。(先ほどの例では、1/5と2/3が対応) (3,4,5)にUAD行列を施して制作される原始ピタゴラス数樹形図は、 (1,3)に>>209 で記した変換公式を施して制作する有理数樹形図と同一で、お互いに変換可能です。 同様に、(1,2)に>>209 で記した変換公式を施しても有理数樹形図ができますが、これらも、お互いに変換可能です。 そして、下二つの有理数樹形図で、全ての有理数を過不足無く網羅します。 UAD行列を使う場合も、(p,q)変換公式を使う場合も、プログラム的にはほとんど差はありません。 前者は同時に三数を扱う一方、後者は二数だけなので、この分高速になります。 ただし、「原始ピタゴラス数を順に表示する」というのが目的であった場合は、変換コストを払う必要があるため、 前者の方が速いかもしれません。特定の場合だけ表示するのであれば、後者の方が高速でしょう。 おお、すばらしい。 お二方に感謝する。 個人的には、「行列を使ってないので、 中学生にも理解できるだろう」という点から、 教育分野で利用してくれれば、と思う。 いわゆる「ユークリッドの互除法」は、 分数の約分・通分には便利なアルゴリズムだし、 それを単位格子に適用すると連分数や フィボナッチ螺旋にする話題にも持ってゆける。 「単位円上に無限個の有理点が存在する」という 証明にもつながれば、「そもそも、一般式をどうやって 導出できるか?」(『数学ガール』にも出てくる) という話にもなる。 これで少しでも数学嫌いが減ってくれれば嬉しい。 もうひとつ、「世界最古の都市文化」といわれる 古代バビロニア(「シュメールのほうが先じゃん」という 意見はあるんですが、そのあたりの議論は略)の時代に、 すでにピタゴラス数について研究していた人々がいた (まぁ、長方形だし、ピタゴラス生まれてねぇし、みたいな 話はあるとして)、というのが分かっただけで面白いし、 コンピュータを利用して、「当時の人々が、どんなことを 考えていたのか」がうかがい知れるので、ソフトウェア 教育にも利用してほしいな、と思っています。 どうも、ありがとうございました m(_ _)m あ、あと、この件に関して、とくに権利とかを 主張するつもりはないので、 どこかで発表するとか論文にして公開する場合でも、 好き勝手にやっちゃってください。 「それも気づまりだな」という律儀な方は、遠慮なく nsb14421@nifty.com までメールしてください(アットマークは半角に)。 では。(^_-)b~* (Maria & Mr.Moto) 大元のHallの論文が載ったMath Gazzetteは教育用の雑誌なので 投稿するといいんじゃないかなあ まあ話を聞いていると、学術論文にまとめる訓練を受けてないから 敷居が高いと思ってるような気がする 論文を書くマニュアル作業を身につけるのも指導者がいないと難しい >>237 > まあ話を聞いていると、学術論文にまとめる訓練を受けてないから > 敷居が高いと思ってるような気がする > 論文を書くマニュアル作業を身につけるのも指導者がいないと難しい いちおう学術論文にまとめる訓練は受けているんだが (^_^!)、 ジャンルと学会によってテイストが違うのよ。 「電気学会」と「電気通信学会」と「日本コンピュータ科学会」でも 違うし、「日本航空宇宙学会」もまた違うだろうし、「言語処理学会」と 「計量国語学会」でも違うと思う。 「数学教育協議会」とか「日本数学教育学会」とかにアプローチするのが 早道なんかな? 「古代バビロニアの数学粘土板」とか言っても、 なかなか通じないんだよな。都立雪谷高校の数学の先生にも訊いてみたんだが、 「同僚にも訊いてみたけど、ちょっと ……」みたいな話だった。 >>238 申し訳ないが、あなたは何か根本的にわかってないように思う テイストが違うのはわかるが、あなたの数学の説明の仕方はこなれてない 問い合わせしている相手も間違ってる 大学のいわゆる数学科に属している教員に接触しましょう 「数学教育協議会」とか「日本数学教育学会」は別物 あなたの結果は大体わかったつもり、以下の雑誌を勧める Math Gazzette https://www.cambridge.org/core/journals/mathematical-gazette Mathematics Magazine https://www.maa.org/press/periodicals/mathematics-magazine >>239 > あなたの数学の説明の仕方はこなれてない すまん (^_^!) もともと航空屋でソフトウェア業界人なので、 「だって飛んでるじゃん」「だって動いてるじゃん」 で済ませてきたもんだから、わりとリクツは後回しなんだ。 演算子法のオリヴァー・ヘヴィサイドじゃないけど、 「数学は実験的科学であり、定義が先にくるわけではない」 「私が消化のプロセスを知らないからといって、ディナーを 断らなければならないのか?」っつースタイルなもんだから、 「数学的に厳密な論文の記述スタイル」っつーのに なじめないところはある。 >>240 ヘヴィサイド同様に、適切な証明を書かないとrejectされます それが数学の流儀ですので、自分はすごい結果を出しているのに〜 と言っても通りません 数学でも新規性が高くはなくても掲載する雑誌はあります あなたが馴染めないのは自由ですが論文掲載までの手続きは変わりません >>241 つーか、数学における「行列の積」っていうのが、 ソフト屋における「配列の積」っていうのと ちょっと違う、っていう問題があるのよね。 内積(スカラー積)と外積(ベクトル積)という 概念上の差があるのは分かるんだけど、 プログラマの頭にあるのは、「一次元配列と 二次元配列の積っていうのは、どうイメージしたらいいのか?」 っていう話なのよ。 {x, y, z}・{x', y', z'} = x*x' + y*y' + z*z' みたいな頭があるんで、「縦ベクトルと横ベクトル」みたいな イメージとかとは、ちょっと違う頭で考えてんですよね。 >>239 による批判があったので、真面目にお応えしたいと思います。 とりあえず、 v_{p, q} = { (q^2 - p^2) / 2, p * q, (p^2 + q^2) / 2 } (p, q は、互いに素な奇数。ただし 0 < p < q) と、 w_{m, n} = { n^2 - m^2, m * n, m^2 + n^2} (m, n は、偶奇が異なる互いに素な自然数であり、0 < m < n) というところから始めましょう。 このあたり、ツッコミがございましたら歓迎いたします m(_ _)m 早々にごめんなさい m(_ _)m v_(p, q) = { (q^2 - p^2) / 2, p * q, (p^2 + q^2) / 2 } (p, q は、互いに素な奇数。ただし 0 < p < q) と、 w_(m, n) = { n^2 - m^2, m * n, m^2 + n^2} ですね。 で、 v_(1, 3) = {4, 3, 5} かつ w_(1, 2) = {3, 4, 5} であり、 「ピタゴラス数について、偶数項=偶数項、(最大ではない) 奇数項=奇数項、斜辺(あるいは対角線)項 = 斜辺項」あるいは 任意の自然数 n について「偶数項=偶数項 × n、奇数項=奇数項 ×、 斜辺項 = 斜辺項 × n」が成り立つときに、合同(≡)であるとする。 したがって、 v_(1, 3) ≡ w_(1, 2) ≡ {4, 3, 5} ≡ {3, 4, 5} ≡ {45. 60, 90} である。 プログラマ的にいうと、 「a ≡ b」は、「equals(a, b) == true」であり、 「{3, 4, 5} = {4, 3, 5}」は、 「({3, 4, 5} == {4, 3, 5}) != true」だということです。 選手交代。 で、ここからが面白いんだ。 1)v_{p, q} = { (q^2 - p^2) / 2, p * q, (p^2 + q^2) / 2 } (p, q は、互いに素な奇数。ただし 0 < p < q) 2)w_{m, n} = { n^2 - m^2, m * n, m^2 + n^2} (m, n は、偶奇が異なる互いに素な自然数であり、0 < m < n) という関数の、逆関数を考えよう。 {x, y, z} が原始ピタゴラス数だったら、(p, q) も (m, n) も 一意に(自然数として)求まるんだが、 {x, y, z} が「原始ピタゴラス数ではない、一般のピタゴラス数」 である場合、(p, q) や (m, n) は、自然数に落ちない!!! これは、一度 自分で計算して確かめてみることをお奨めする。 つまり、V_(p, q) および W_(m, n) を(「引数が自然数である」 という条件を保ったまま)「原始ピタゴラス数ではない、 一般のピタゴラス数」に拡張しようと思うと、引数を一個増やさないと いけない。つまり、V_(s, p, q) または W_(s, m, n) で表さないと いけない。 これが、プリンプトン322の11番と15番が “原始” ピタゴラス数に なっていない理由につながっていたりする。 おそらく、>>127 に大きな勘違いがあるのが見えます。 >> 脱帽します。私は、Barning と Hall の業績を知ったうえで、 >> その逆問題(任意の原始ピタゴラス数を、{3, 4, 5}と >> U, D, A の積で表すアルゴリズムを求める)が未解決 >> だというのを知り、それを連分数によって解決してから、 >> 図形的な解法を思いつきました。 とありますが、「任意の原始ピタゴラス数を、{3,4,5}とU,D,Aの積で表すアルゴリズムを求める問題」 は簡単に解決しています。「解決」と書きましたが、問題設定と同時に解かれるような問題で、 「解決」という言葉は、不適当と感じるような内容です。 私の一番最初の投稿 >>119 のプログラムの中に、原始ピタゴラス数を与えると、「番号」を返す 関数がありますが、それが、具体的な手順を与えるプログラムになります。 UDAが書かれていないじゃないかというかもしれませんが、「番号」にその情報が詰め込まれています。 番号は三分木構造の住所を表す指標となっています。住所が分かれば、(3,4,5)と、どのような経路を経て あるいは、長男、次男、三男の誰を通して、あるいは、U,D,Aのどれを適用して、その原始ピタゴラス数 と繋がっているか、一意に決定されます。具体的な手法は >>208 に記してあります。 「逆問題」が、ここで書かれている内容であれば、未解決であるはずがありません。そう仰っていた方が間違っている のかもしれませんし、未解決としている部分を勘違いされているかもしれません。整理を望みます。 >>119 は a^2+b^=c^2下での恒等式 (-a-2b+2c)^2 + (-2a-b+2c)^2 = (-2a-2b+3c)^2を利用した 原始ピタゴラス数に関する各種プログラムでしたが、今回は p/q → p/(2p+q) , q/(-p+2q) , q/(p+2q) という変換が、有理数生成法として完全系であることを利用したプログラムとなっています。 多くの場面で前回のものを流用し、サンプルなどは同じ物を使っていますが、エンジンは別物です。 前回のエンジンは、事実上UDA行列の利用と同じで、原始ピタゴラス数の三数を媒介しているのですが、 今回媒介しているのは、有理数p/qで、整数二つです。 http://codepad.org/W400rZjo 4種類の内容をまとめて走らせています。 ・p,qを小さい方から変化させ、pq値、ピタゴラス数、番号を表示 ・番号順にpq値、ピタゴラス数を表示 ・与えられたピタゴラス数に対し、pq値、番号を表示 ・与えられた番号に対し、pq値、ピタゴラス数を表示 手抜き感満載なのはご了承ください。 >>248 任意の原始ピタゴラス数があったとして、 それに U^(-1) ・ A^(-1) ・ D^(-1) をそれぞれ 掛けて、そのうち意味のあるものが「親」にあたるので、 e に到達するまで その操作を繰り返せばいい。 そういう意味では、そもそも「逆問題」というものは 存在しない、とも言えます。 で、細矢 治夫先生が、『トポロジカル・インデックス』の中で、 Barning=Hall の定理の「大きな泣き所」としているのが、 この「試行錯誤が必要」という点でした。 「試行錯誤ではなく、アルゴリズムの形で、ストレートに解けないか?」 という問題意識があり、「そういう方法があるはずだ」という予想が ありました。ところが、「行列」という視点で問題に取り組むと なかなか面倒臭いことになる。 それを、「互いに素であり、相異なる自然数の組」からなる 空間に移動し、そこから {1, 2} あるいは {1, 3} へ移動する ルートを探すという方法だと、「大きい方から小さい方を二回 引いて、絶対値を取る」だけでルートが見つかってしまう。 で、「大きい方から小さい方を引く」という操作は、「ユークリッドの アルゴリズム」として知られているものです。現在は「互除法」と 呼ばれ、「大きい方を小さい方で割った余りを求める」と捉えられて いますが、ユークリッド自身の記述によれば、「互減法」とも いうべきものです。 ですから、「未解決問題を解いた」というより、「素朴な証明を 提出した」くらいの話になるでしょうか。 試行錯誤は必要ありません。 >>119 の三つ目のプログラムをご覧ください。 q[0]=- p[0]-2*p[1]+2*p[2]; q[1]=-2*p[0]- p[1]+2*p[2]; q[2]=-2*p[0]-2*p[1]+3*p[2]; if(q[0]<0){ q[0]=-q[0]; if(q[1]<0){q[1]=-q[1];r=1;}else{r=-1;} }else{ if(q[1]<0){q[1]=-q[1];r=0;}else{return 0;} } return 3*g(q)+r; と書きました。q[0]の正負、q[1]の正負で、rの値を -1,0,1 と変化させています。 これが将に、長男、次男、三男の見極めなんです。 これは、(-a-2b+2c)^2 + (-2a-b+2c)^2 = (-2a-2b+3c)^2 を利用して新しい ピタゴラス数を生成させる際、a→-a という置き換えを使ったか、 b→-bを使ったか、両方の符号反転を使ったかに対応します。 >>250 で、ここに至る過程で、「 q / p を連分数展開したらどうなるか?」と 思いついて、「U・D・A というのは、そのときのどういう操作に 対応しているのか?」を考えて、そこに 2 が出てくるということに 気づきました。奇数+偶数=奇数、偶数+偶数=偶数 ですから、 「互いに素で相異なる二数に対して、『大きいほうから小さい方を二回引く』 という操作を行なっても、『互いに素である』という性質は保存され、 『ともに奇数』『偶奇が異なる』という性質も保存される」という ことになります。 問題は、q - 2p がマイナスの場合です。このとき、「長方形から 正方形をふたつ取り去ったときに、面積がマイナスになってしまう」 ということになるわけですが、それも図形的に解釈できました。 「じゃあ、その逆操作は?」ということになり、「それは三通りある」 ので、U ・ D ・ A と比較してみると、それぞれが対応していることが わかりました。 「意外に気づかんもんだなぁ」と思ったんですが、しつこいようですが プリンプトン322は五十年以上未解読で、いろんな人があーだこうと、 みんなそっちへ行っちゃうということは、あるんだなぁ、と。 それで、「こういう面白い話があるんですよ」と、お知らせしようと 思いました。 プリンプトン322は、古代バビロニアの数学粘土板です。 おおむね三千八百年前、ハンムラビ王の治世のころに 作成されました。文書のスタイルとしては、当時の 公文書のスタイルで書かれていて、書かれている文字については、 室井 和男先生が解読されています。詳しくは、中村滋『数学の花束』を どうぞ。読んだことないけど。 で、そこには15個のピタゴラス数が記されています。 この15個の数値に関しては諸説あるんですが、 現時点ではエレノア・ロブソンという人(あたし、 会ったことないけど、この人嫌い)の説です。 「プリンプトン322は、初期見習いのための 計算の課題である」というものです。 これとは別のマイナーな説ですが、「これは 三角関数表である」というのがあります。 オットー・ノイゲバウアー先生と室井和男さんが この説を支持しています。 すなわち、 ・三角関数なので、直角三角形(あるいは、単位円上の 有理点)の表である。 ・公式としては W_(m, n) を使った。 ・範囲としては、45° から 30° まで。 ・だいたい一度ごとに、計算するときに便利な値を 選んだら、この15個になった。 ということです。けっこう説得力がありますね。 ところが、W_(m, n) を使って原始ピタゴラス数を 計算すると、うまくこの15個が出てこないんですよ。 「なんか、これ違うんじゃない?」と思ってよく見ると、 短辺と長辺の比が、1.0 と 1.618 の間に入ってるんですよね。 「これ、三角関数じゃなくて、長方形なんじゃない?」と。 つまり、「正方形と黄金長方形の間にある、縦横と対角線の 長さが、自然数の比で表現できる長方形の表」なんではないかと。 ところが、それにしても m, n の値が半端なのが気に入らない。 そんでもって、「これは公式が違うんじゃない?」と 思っていろいろ調べているうちに、V_(p, q) の式に 辿り着きました。そこで計算してみると、 まぁ、なんということでしょう。 正方形と黄金長方形の間にある、q < 180 のときの V_(p, q) で表される15個の長方形が、プリンプトン 322に記されている 15 個の数と、一致するでは ありませんか! ただ、ここで喜ぶのはまだ早い。45° から30° というと、 1.0 から √3まで、ということになりますよね? だったら、 その範囲でも15個になるかもしれません。で、計算してみたところ、 1.618 と 1.7320508 の間に、一個、解があるではありませんか。 あの連中(もはや古代バビロニア神殿の書記たちは他人ではありません。 心の友です)が、これを見逃すわけがない。やっぱり黄金比だ! 謎はあと二つ。 1)#11 は 15 倍、#15 は 2 倍されていて、原始ピタゴラス数になっていない。 2)粘土板の向かって左端が削られている。 なぜでしょうか?というものです。 ここから先は、あたしたちの妄想です。 #11 の長辺には、60 という数字が出てきます。で、 60 には、1, 2, 3, 4, 5, 6 が約数として出てきます。 そこで、#15 に着目すると、その面積に 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 が出てくるんです! うん、キミらはそういうのが好きなんだね? わかるわかる。 じゃあ、最後の謎です。 プリンプトン322は、最初 1;φ で作られていたんだと思います。 「なんかダサくね?」「そもそも、長すぎて割れやすそうだめ」 「だったら、削っちまっていいんじゃね? 小数点のトコしか 使ってねぇから、無視できるべ」「んだな。」 ということで、1 : √2 にしちゃたんです。 「ほーら、カッコいいっぺ」「ちょうど、パスポートサイズだなや」 「SONY のハンディカムだなや」「まだ売ってねぇだよ(wwwww」 となると、削られてしまった数値の役割はなんでしょう? そう、「整列キー」だったんですね。 つまり、プリンプトン322の正体は、「古代バビロニアの算額」 (あるいは、その試作品)だったんです。 >>250 申し訳ありませんが石版については興味が無く、>>251 に続く内容になります。 「これこれの行列を使えば、新しいピタゴラス数を作ることができる」という ことに気づいた人たちの中には、いくつかの原始ピタゴラス数の組み合わせだけで UDA行列に到達した方々がいるようです。 そのような内容の文献あるいはサイトを見たことがありますから。 確かにそのような経緯でUDA行列に到達したならば、>>251 で書いたような事には 気づかなく、試行錯誤が必要と考えるかもしれません。 が、私は、導入部分が、(-a-2b+2c)^2 + (-2a-b+2c)^2 = (-2a-2b+3c)^2 であること。 a単独、b単独、a,b両方の符号反転により生成される恒等式が、UDA行列と同内容になる事等を >>120 等で説明を与えているし、>>119 ではプログラムで具体的に示してもいます。 逆変換すれば、負になるものが現れ、それを見極めれば、UDAのどの変換に相当するか 見極められるというのは、全く自明で、「解決」が必要なものに等ならないのです。 あなたは、これらに触れていたはずです。ならば、あなたは「逆問題」など、すでに解決済み だということに気づくべきだったのではありませんか? 「逆問題」など無い、あるいは、解決済みと言うことでよろしいですね。 >>260 > 「逆問題」など無い、あるいは、解決済みと言うことでよろしいですね。 そういう解釈で結構だと思います (^_^) > あなたは、これらに触れていたはずです。ならば、 > あなたは「逆問題」など、すでに解決済みだということに > 気づくべきだったのではありませんか? あえて無視した、と解釈していただいても宜しいかと (^_^) この問題について問題提起をされた細矢先生は、有機化合物の 構造決定と検索の方面で有名な方でして、「図式化による直観的な 把握」というものを重視していらっしゃいました。 現在、高校数学の新課程において行列は教えられていませんので、 これは「大学生以上でないと理解できない」ということになって しまうんですが、大学の教養課程では「高校数学の復習」以上の ことはなかなかできない(そもそも、高校数学は受験数学に 偏りがちであり、就職組はそもそも数学なんか やる気がない)ので、 そのあたりは何とかしたい、と思いました。 いわゆる「ベルトラン予想」に対するチェビシェフによる証明は ガンマ関数を使った高度なものでしたが、のちにポール・エルデーシュが 高校生のときに初等的な証明を与えました。一松 信先生は、エルデーシュによる 初等的な証明をさらに解きほぐしたものを発表しました。 大学生のときに「ベルヌイの定理」が理解できなくて悩んでいたのですが、 航空業界から離れてから「なんだ、要するにエネルギー保存則じゃないか」 と気づいたこともあって、「証明はすべからく簡明でありたい」と 思っています m(_ _)m >そういう解釈で結構だと思います (^_^) >あえて無視した、と解釈していただいても宜しいかと (^_^) こりゃあダメだな、研究発表の何かがわかってない 「知られている証明の別照明を与えた」と最初からいえば良かったのに ま、何言ってものらりくらりかわすだけ Webで書くなら勝手にすればいいが「数学会は俺の研究を評価しない」とか言うなよ ×「知られている証明の別照明を与えた」と最初からいえば良かったのに 〇「現在知られている証明とは違う、別証明を与えた」と最初からいえば 良かったかもしれないが、それは後付けの理由になってしまう。 それは「いわゆる “数学者”」に受け入れられないかもしれない、 と後から思ったんだけど、みたいな話を延々としても不毛だと思うんで、 「アイゼンシュタイン三角形」とか、「ヘロンの公式って、 内接円で考えるのはいいんだけど、数論的には別の切り口が あるんじゃねぇ?」みたいな話に、教育的には 持ってゆきたいんだが。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる