ピタゴラス数をなんと 〜荒らされたので立て直しました〜 [無断転載禁止]©2ch.net

1旭=10002016/11/02(水) 07:53:23.97ID:kmhD7zB7
自分で作ったプログラムでa^2+b^2のaが35万以上計算しました。
100万以上に向けて頑張りたいと思いますので
応援お願いいたします。
プログラムにバグがあった場合抜けている数があると思うので
その点には留意いたしたいと思う次第であります。

134132人目の素数さん2018/07/24(火) 09:13:39.70ID:R4xS6L6u
ごめんなさい。
>>119
> 三つ目のプログラムは、原始ピタゴラス数を、(奇数項,偶数項,斜辺項) の
> 順番に与えなければなりません。
{3, 4, 5} が最小だから、この順番が基本だよね? >>133 では
逆にしてました。(奇数項, 偶数項, 斜辺項)というスタイル以外に、
(短辺、長辺、斜辺)というスタイルもあるので混乱していました。
UDA 行列も、縦ベクトルに向かって右から行列を掛ける
スタンダードな方法と、横ベクトルに向かって左から行列を掛ける
「海軍式」というのがあるそうですので、たぶん形も二種類あることに
なります。
> 本来ならば、この辺の融通が利く形でアップすればいいのでしょうが、
> 面倒なので省略しました。ご了承ください。
「面倒臭がり(怠惰)」は、プログラマの三大美徳のうちの一つ(Larry Wall)だ
そうですから、よろしいんじゃないですか(笑)。(残りの二つは「短気」と
「傲慢」だそうです)
私も暇をみて改修してみようかと思っています(とはいえ言語は Java ですが)。

135132人目の素数さん2018/07/24(火) 12:43:54.91ID:avmv8LiY
>>134
ピタゴラス数、あるいは、原始ピタゴラス数から新しい(原始)ピタゴラス数を生成する
という目的においては、UDA 行列のどれを用いても、かまわないと思います。
ただ、「ナンバリング」を行う上では、「U行列を用いた場合の番号変換はこれ、D行列を用いた場合の
番号変換はこれ、...」などと、ルールを固定しなければなりません。
同時に、生成されたピタゴラス数に対しても、aなのか、bなのか、見極める手段が必要となります。

この意味において、短辺か長辺かという視点は適切ではありませんでした。
しかし、第一項(=a)を奇数項、第二項(=b)を偶数項、そして、変換式を
(a,b,c)→(a~,b~,c~)=(-a-2b+2c,-2a-b+2c,-2a-2b+3c)
及び、これのa,bの符号を反転したものに固定すれば、この性質が維持されることが、
上の式を見ていただければ、判ると思います。それ故、ナンバリングを行う際には、この方法を採用しました。

もちろん、(a,b,c)→(a~,b~,c~)=(-2a-b+2c,-a-2b+2c,-2a-2b+3c) という変換式を採用することも可能でした。
その場合、世代の偶奇で、a,bの偶奇が入れ替わるようになってしまいます。

あと、Plimpton322の話は初めて見ました。ちょっと眺めてみましたが、メソポタミア流の
タンジェントの数表なのではと思いました。
そして、その値を定めるのに参考にした直角三角形のデータが添えられているだけなのではと。
そう考えると、ピタゴラス数に関連する値が出てくるのは、至極当然な事となります。

136132人目の素数さん2018/07/24(火) 15:10:14.66ID:R4xS6L6u
>>135
> あと、Plimpton322の話は初めて見ました。ちょっと眺めてみましたが、
> メソポタミア流のタンジェントの数表なのではと思いました。

『「まぁ待つさ」と、僕は答えた。』
ファインマン『ご冗談でしょう、ファインマンさん II ― ノーベル賞
物理学者の自伝』p.144

137132人目の素数さん2018/07/24(火) 15:22:37.08ID:R4xS6L6u
申し訳ございません m(_ _)m
>>124
(都市文化発祥の地であると謂われている)古代メソポタミアは、
(ユークリッド幾何学が成立した、「公準」「公理」「定理」の
ような)「証明」「論証」のシステムは成立していなかったであろう、
という話が前提にあって、「数学的な扱いやすさ」と「数学教育的な
観点」の間のギャップについての配慮が足りなかった、という点に
ついてはお詫びします。ごめんなさいm(_ _)m

そもそもが、>>124 で「長方形」という言葉を出し忘れていたのが
問題であったと思います。

「短辺と長辺と対角線の比が、自然数の比で表される長方形」と、
はっきり言明しなければならなかったと思います。

「正方形はどうなるんだ」という意見もあると思うんですが、
その時点で「正方形の対角線は、辺長との比は無理数である」と
いうのが明らかになって以降の概念、と考えていますので、お赦しを。

138132人目の素数さん2018/07/24(火) 15:55:24.12ID:R4xS6L6u
すみません。あとひとつだけコメントを。
ピタゴラス数(あるいは、ピタゴラス数による三角形
または長方形)を、有理数の上で(直観的に分かりやすい
形で)整列するのは、かなりややこしい話になると思いますよ?
>>127 で述べたように、q/p で考えると、わりと綺麗に
整列ができると思います。
そのとき、「正方形にいちばん近い p と q の比はどこに
あるのか?」という話になって、連分数表示だと、そこに
黄金数 φ が顔を出す、というのがまた面白いんですが。

139132人目の素数さん2018/07/24(火) 19:38:39.00ID:avmv8LiY
>>127
>> このとき、二つの奇数 p と q を考えたときに、長方形 p × q を
>> 考えて、「面積が同じであるときに、正方形に近いのはどっちか?」を考えると、順序付けが可能です。
第一キーが面積の小さい順、第二キーが正方形に近い順、のような方法で、
整列するということでしょうか。そのようなアプ□−チ法もありますね。

私が、思いついていたのはもっぱら 分数の整列 を介しての方法です。
第一象限 の y<x 領域の格子点を原点に近い順に並べる。ただし、(x,y)に対し、分数y/xを与え、同じ値のものは除外とか、
Farey分数を利用するのも、ありかと考えました。
しかし、これらいずれも、番号→分数、あるいは、分数→番号 を得る手順が美しくありません。

二つの奇数p,qを用いての方法を用いた場合も、番号を与えてそれに対応する原始ピタゴラス数を答える、
あるいは、逆に原始ピタゴラス数を与えて、それが何番かを答えるという関数を作るとすると、
オイラーのφ関数の積算か、それに準ずる計算が必要となるのではないでしょうか

>>119の方法は三分木構造に沿って生成されるものなので、番号から原始ピタゴラス数を求める時も、
原始ピタゴラス数から番号を求める時も、単純な計算を、log[3](n) 回ほど繰り返すことで求めることができます。
いずれも大きなところでの計算時間は、この方法の方が早いのではと思います。

p.s.通常の書き方の「アプ□−チ」がなぜかNGワードのようで、投稿ができませんでした。遅れて申し訳ありません。

140132人目の素数さん2018/07/24(火) 20:27:46.44ID:R4xS6L6u
>>139
> 逆に原始ピタゴラス数を与えて、それが何番かを答えるという関数を
> 作るとすると、オイラーのφ関数の積算か、それに準ずる計算が
> 必要となるのではないでしょうか
本当にそうです (T_T)。
すべての自然数とすべての(正の)有理数は、
ともにアレフ・ゼロ(可算無限個)なので一対一の対応づけが可能だ、
ということは理論上は確かなんですが、その順序性を保持したまま
対応づけをしてしまうと、自然数を与えたところで有理数は「実質ゼロ」に
なってしまい、有理数を与えると自然数は「実質、無限大」という話に
なってしまいます。
そういう面倒臭いところが、無限の無限たるゆえんというか、めんどうくさい
部分なんですよ。ゲオルグ・カントールが「われ見るも、われ信ぜず」と
告白したというのも頷けます。
いまのところ、「UDAで一意に表せるんだから、三進数で表現するのが、
いちばん素直なんじゃねぇの?」という投げやりな意見が、我々の いちおうの
公式見解ということになっています。
だけど、それをすると大小の比較関係が単順序構造じゃなくて
半順序構造になってしまう(実際には、半順序構造が成立すると考えると
「木構造」ではなく「束(そく)」になってしまうので、また扱いが異なって
しまうんですが)んですよね。
それが、Barning=Hall=亀井の定理の逆問題を半世紀以上“未解決”にしていた
原因なのではないか、と思ったりはしています。
ですから、任意の原始ピタゴラス数の比較関係としては「共通の根が、
どこにあるか」で判断するしかないと考えています。

141132人目の素数さん2018/07/24(火) 20:31:43.54ID:R4xS6L6u
そうそう。そのあたりのアプローチとしては、細矢治夫先生が、
トポロジカル・インデックス(有機物のような、分子量が大きく
複雑な構造をもつ分子を、どのように検索・比較するかという指標)
によって評価しようとしていらっしゃいました。
数学的な考察に役立つかどうかはわかりませんが、ご参考までに。

142132人目の素数さん2018/07/25(水) 06:40:30.35ID:+NKwYrVS
>>140
> 「UDAで一意に表せるんだから、三進数で表現するのが、
> いちばん素直なんじゃねぇの?」
ということで、Java による逆ルートの探索プログラム(Java 版)の
ソースおよび解説は、「BackLog 四角い三角形」で検索すると
すぐ見つかるはずです。(引用およびソースの再利用は歓迎します)。

143132人目の素数さん2018/07/25(水) 16:34:08.79ID:+NKwYrVS
>>139
> p.s.通常の書き方の「アプ□−チ」がなぜかNGワードのようで、
> 投稿ができませんでした。遅れて申し訳ありません。
>>141
> そのあたりのアプローチとしては
たぶん、お使いのプロバイダを利用しているユーザの
環境に、分散型の、Dos アタックを仕掛けるマルウェアが
巣食っていたのだと思います。
しばらく(三十分以上)放っといて再アクセスすると、
だいたいなんとかなるようですよ (^_-)b~☆。

144132人目の素数さん2018/07/25(水) 22:50:22.66ID:zjqtyd5e
「長方形から正方形二つを取り除く」のような操作が、どうしてUDA行列の
話と直結するのか、不明瞭でしたが、紹介されたところを見回って、見えてきました。

UDA行列や、(-a-2b+2c)^2 + (-2a-b+2c)^2 = (-2a-2b+3c)^2 等の話は、
原始ピタゴラス三角形の辺長 a,b,c (a^2+b^2=c^2)の値そのものの話であり、操作です。

この、a,b,c が変化する様子を、a=m^2-n^2、b=2m*n、c=m^2+n^2(あるいはその半分?)
を満たす、m,n の世界で眺めたとき、m*nの長方形において、二つの正方形を取り除いたり、
追加したりする操作に対応すると言うことだったんですね。すっきりしました。


全ての原始ピタゴラス数は、単位円上の一つの有理点に対応します。
そしてこの有理点は、一つの有理数に対応可能です。
(変換方法はいくつも考えられますが、最も一般的な方法は、((1-t^2)/(1+t^2),2t/(1+t^2))を利用するもの。)

従って、全ての有理数を、何らかの有理変換を、何度か経て、1/2 or 2 (原始ピタゴラス数{3,4,5}に対応する有理数)
に到達でき、また、その逆も可能なら、それらの有理変換は、原始ピタゴラス数を整理する道具に使えると言うことですね。

145132人目の素数さん2018/07/26(木) 12:34:22.68ID:JRXvy3Hy
>>144
私の思うところのものを正当に理解して下さっていることを
感謝します。m(_ _)m
数学の初心者に対して(「あなたが数学の初心者」であるという意味ではありません。
あなたは、おそらくは数学を教える立場に立つことに向いていると、私は考えます)、
より分かりやすい形でいうと
> 従って、全ての有理数を、何らかの有理変換を、何度か経て、
> 1/2 or 2 (原始ピタゴラス数{3,4,5}に対応する有理数)
> に到達でき、また、その逆も可能なら、それらの有理変換は、
> 原始ピタゴラス数を整理する道具に使えると言うことですね。
における「有理数」が、「すべての既約分数」と同義である、
ということに対して言及(つーか、念押しというか注意喚起っつーか)
して下さると、嬉しく思います。

146132人目の素数さん2018/07/26(木) 14:17:52.60ID:JRXvy3Hy
>>144
『Ikuro's Home Page』(ttp://www.geocities.jp/ikuro_kotaro/)の
『今月のコラム(閑話休題)』のなかの、『エジプト三角形の作図』や
『ピタゴラスの小石?』なんかは、このスレと関連して
面白いかと思います。お勧めです。

147132人目の素数さん2018/07/26(木) 14:32:40.43ID:JRXvy3Hy
そうそう。小学校の算数の授業では、「分数の約分」は
教わるんですけど、「分子と分母に対する共役数を
求める方法」は現在の教育では、教えていないんですよ。
「なんで互除法を教えないのかなぁ? 分子分母の
最大公約数を求めて、それで分子と分母を割ればいい
だけじゃないの?」と思うんですが、「最大公約数」とか
「ユークリッドの互除法」を、「小学生にもわかるように
説明する」ためのノウハウが、小学校で算数を教えている先生に
伝わっていないのではないか、と思います。
(正方格子空間における)「長方形」をベースにした互除法の説明は、
たぶん小学生にも通じると思うのですが、いかがでしょうか。

148132人目の素数さん2018/07/26(木) 18:52:51.46ID:JRXvy3Hy
「ユークリッドの互除法」「連分数」
「黄金比」「白銀比」は、実用的な観点からも
教育的な観点からも、セットで教えたほうが
いいように思います。
小学校高学年から中学校にかけての年齢だったら、
充分に理解できる概念のように思うんですが、
さいきん「中高一貫教育」というのが流行りなので、
「小学校で教えられていないものを、中学校の
受験問題に出題するのは、いかがなものか?」みたいな
配慮があるのかもしれません。
その結果、「受験で出ないものは出さない」ことになり、
学ぶ機会を失っているのかもしれません。
だったら「約分・通分」と一緒に、「因数分解」「素数」
について、じっくり教えたほうがいいと思うんですけどねぇ。

149132人目の素数さん2018/07/26(木) 23:36:41.89ID:xzFiG0dr
『Ikuro's Home Page』さんには、よくお邪魔してます。大変参考にさせていただいています。

最大公約数の話ですが、「ユークリッドの互除法」と名付けられている方法があることを、
おそらく私は高校1年で習いました。ただ、a と b の公約数は、a と a-b の公約数でも
あることを、どこで教わることもなく、体得していたため、当然のことと受け止めたことを覚えています。
小学生相手には「ユークリッドの互除法」ではなく、(a と b の公約数)=(a と a-b の公約数)
を教えるだけで、ほぼ十分なのではないかと思います。これを繰り返していけば、
自動的にユークリッドの互除法にたどり着きますし。

「連分数」 、「黄金比」、「白銀比」、などを、小中学生に面白く教えることができれば、
数学好きな児童・生徒を増やせそうですよね。あと、フィボナッチ数列なんかも。
でもこれらは、学校の算数/数学の授業にはそぐわないと考えられているのではないでしょうか。
特別授業とか、地域住人参加可能な公開授業なんかの方が相性がよいと思います。

144に関連し、何か面白い有理数→有理数→有理数→...の様な変換はないかと思っていたんですが、
思いがけず、Farey分数がそのまま使えることに気づきました。
Farey分数は二分木構造そのものですから、原始ピタゴラス数を二分木構造に埋め込むことが可能です。
例の三分木構造は、一つのピタゴラス数から、一人の親と三人の子を直接見つけることができますが、
この二分木構造は、親子関係を確定させるためには、ある程度の近親者情報が必要となります。
そのため、あまり面白くはありません。

150132人目の素数さん2018/07/27(金) 08:34:11.72ID:7B8ArIq3
ユーックリッドの互除法自体は、大学生になってから
知ったのですが、「格子点を持つ長方形」の性質に
ついては、小学生のときに気づいていました。
小学生のときには病気がちで、和室に布団を敷いて
寝かされていたのですが、そのとき障子が目に入るんですよ。
で、角のところから45°の角度で格子点を辿ってゆく
(辺のところでは“反射”する)と、mとn が互いに素であるとき、
すべての升目を一度づつ通って別の数に至ることに気づきました。
このとき、辺に着いたら、隅からその点を対角線として持つ正方形
になるわけで、後にフィボナッチ螺旋を見て「あぁ、そういうことか」と
納得しました。
ですから、私にとっては「ユークリッドの互除法」と「連分数」は、
同じコインの両面、というイメージがあります。

151132人目の素数さん2018/07/27(金) 08:43:48.23ID:7B8ArIq3
>149
>>(a と b の公約数)=(a と a-b の公約数)
と約分については、a と b のそれぞれを素因数分解して
重複している素因数の積、という頭があるので、
たとえば分子分母の大きいほうから小さいほうを
取り除いていって、「上下が同じになる」か「上下が 0 」になる
というリクツがいまいち腑に落ちません。
小学校で、「約数をすべて求めよ」という場合は因数分解してから
組合せを作るというのもなかなか大変だし、そもそも「素因数分解の
一意性」だってギリシャ時代には「経験的に明らか」とされていましたが、
厳密な証明はガウスを待たなければなりません。また、「素因数分解を
行なう効率のよいプログラムは発見されていない」とかいった話も
ありますし。
このあたりのギクシャクした話が、算数嫌いの子供を生み出しているかも
しれない、とは思います。

152132人目の素数さん2018/07/27(金) 08:53:00.15ID:7B8ArIq3
そうそう。私は「ユークリッドの互除法」を「二つの実数の比を
有理数で近似する方法」として知ったのが先で、「自然数で表される
長方形から正方形を取り除く方法」だと知ったのはその後です。
遠山啓先生と銀林浩先生の子供向けの本に、「二人の承認が「異なった
長さの布の値段を決める」ために、短いほうで長い方の布を取りつくし、
残った半端な部分でもう一つの布を取りつくし …… とやっていって
連分数表示を求め、そこから元の比を計算する」という話が出てきました。
古代メソポタミアでは、同じような方法で、長方形の土地の形状比を
もとめていたのではないか、と私は考えています。

153132人目の素数さん2018/07/27(金) 09:15:13.56ID:7B8ArIq3
コンピュータを用いてユークリッドの互除法を行なうには二種類あって、
わりあいに一般的なのが「繰り返しによる方法」で、ちょっとトリッキーな
感じがするけれど慣れると自然、というのが「再帰呼び出し(リカーシブ)を
使う方法」です。私はリカーシブ派なのですが、「ベズーの公式を互除法を
使って解く」という話があり、それをプログラムで書いてみようとしたところ、
どうもリカーシブで書くとややこしいことになりそうだ、ということになって
しまいました。
実際のプログラムは、『BackLog』の『ベズーの公式。』
(2015/12/18)に掲載。関連エントリは、ちょっと前にいくつかあります。
Java がある程度読めないと while(true) みたいな制禦構造が出てきたり
インデントが変だったり(loop - until - do - repeat 構造、別名を
「n + 1 / 2」ループ」といいます)して読みにくいし、動かそうと
思うと Eclipse のような IDE があったほうがいいので面倒臭いですが、
いちおうご参考までに。

154132人目の素数さん2018/07/27(金) 09:49:38.76ID:7B8ArIq3
>149
> 「連分数」 、「黄金比」、「白銀比」、などを、小中学生に面白く教えることができれば、
> 数学好きな児童・生徒を増やせそうですよね。あと、フィボナッチ数列なんかも。
> でもこれらは、学校の算数/数学の授業にはそぐわないと考えられているのでは
> ないでしょうか。
遠山啓(とおやま・ひらく)さんという「数楽者」(「すーらくもん」と読みます。
『数学セミナー』の創刊者です)の方が、「『ひと』熟」という子供のための
キャンプのようなものをやってらっしゃって、小学生にも中学生にも、普通に
理解できたようですよ? 通称を「水道方式」といいまずが、実際の広い概念は
教具や基本思想を含めると、もうちょっと広い。ただ、遠山 啓(とおやま・けい)
という方が水理学の方がいらっしゃって、『下水道』という本を出していたのを
見て大いに気に入った、というエピソードがあります。

155132人目の素数さん2018/07/27(金) 09:58:05.95ID:7B8ArIq3
遠山さんは、「子供を教えたい」というので東工大のお辞めに
なって児童教育のほうに進まれました(たしか「山びこ学校」かな?)。
「授業が終わってから、子供たちに『これは、勉強か、遊びか?』と
訊いたら、『面白かったから、あそびだ』と答えてくれた」といって
ニコニコされていたそうです。また、「子供という、こんなに面白い
オモチャを貸してもらえないて、しかも給料まで貰えるんだから、こんなに
いい商売はない」とも。森毅センセが遠山さんにお会いしたとき「大学を
辞めるとおもしろいぞ! 森クン、キミも早く辞めたまえ」と肩を掴まれた
そうです。「まだ助教授なんで勘弁してください(T_T)」と頭を下げたとか。

156132人目の素数さん2018/07/28(土) 01:29:16.71ID:En721ByW
Farey分数を順番(※)に表示する関数、分数から(※)で定義した順番を返す関数、
順番からFarey分数を返す関数を作ってみました。
分数からピタゴラス数へ変換可能なので、それも併記してあります。

単位円上の2点(3/5,4/5)と(4/5,3/5)に対応する既約分数が異なるため、
同型のピタゴラス数が二つづつ登場してます。
「分母分子とも奇数」型か、「どちらかが偶数」型で分離できるようですが、
あえて、{3,4,5}と{4,3,5}を別々に扱うこととしたピタゴラス数のナンバリングが
完成できたと思います。

ttp://codepad.org/NkJaTo4f

157132人目の素数さん2018/07/28(土) 11:10:34.79ID:qqQucTqD
>>156
本当に余計なお節介だというのは重々承知しているし、
数学関係の専門書に出てくるプログラムがああいう感じの
C のプログラムだというのもよく知っている(数学者の
先生は、ソフトウェア開発が専門ではないので、とりあえず
動いてロジックに問題がなければ御の字、と考えていらっしゃるのは
頷ける)のだが、
K&R のスタイルは、そんなにガチガチに遵守しなくていいんだぞ?
適当な統合開発環境(IDE)があったら、乗り換えたほうが楽だ。
私はそれで Eclipse と Java に移行した。Eclipse の前身は
VisualAge C/C++ という C/C++ の IDE だったから、
たぶん C でもなんとかなると思う。

158132人目の素数さん2018/07/28(土) 12:30:53.54ID:qqQucTqD
>>156
ついながら、「配列」は “arey” ではなくて “array” 、な。

159132人目の素数さん2018/07/28(土) 13:17:36.82ID:qqQucTqD
失敬。Faray は人名のほうだったか。「なんちゃらかんちゃら配列」
かと思っていた。
私は原始ピタゴラス数のことを、Babylonian Rectangle と呼んで、
そういう名前のオブジェクトを定義し、
Java の ArrayList に突っ込む、という形でプログラムを
書いていたので「この配列はなんだ?」とか考えこんでいた。(-_-!)

160132人目の素数さん2018/07/28(土) 13:28:55.01ID:qqQucTqD
WikiPedia によると、ファレイ数列は連分数と関連があると
書いてある。プリンプトン322を解読していたときに、
「古代バビロニア人は 180 以下の(分子分母がともに
基数の)既約分数をどうやって網羅したんだろう、と
首を捻っていた(もちろん「根性で」という可能性も
高いんだが)のだが、黄金数 φ を連分数表示すると
[1; 1, 1, 1, 1, …] で1+√2が[2; 2, 2, 2, 2, …]
というのを見ると、「ワシらは三千年以上も前の
連中の後追いをしていたのか?」と気弱になってくる。orz

161132人目の素数さん2018/07/28(土) 14:20:11.82ID:En721ByW
自分でよく使っている環境は別にあります。
そこで作成したものを、codepadに移植する際に、クラシカルなものになってしまっているのだと思います。
以前、別の言語で実行させたとき、原因不明のエラーが出て、対処に困りました。
そのとき、このスタイルで実行させたところ、うまく走ってくれたので、
ここに投稿するときにはこのスタイルを取ることにしてます。
もし、字下げや、関数の呼び出しのようなスタイルに対するものでしたら、染みついたものですから、しょうが無いですね。

それと、私は低級側好みます。
例えば、next_permutationという関数があります。次々に新しい順列を返してくれるものです。
使う側としては便利なのですが、どのようなアルゴリズムでやっているのか気になって調べたら、
「無駄」があることが判りました。数度だけ利用するなら、全然問題にならないレベルですが、
全ての順列を発生させる場合には、無駄な処理を繰り返すことになっています。
ということで、順列を発生させるような場合も、自分で発生させています。
このように、内部で何をやっているかよく分からず、かつ、自分で作成できるような場合は
自作することが多いです。私にはC++が馴染んていると思うのですが、この辺に理由があるんだと思います。

「Farey分数」は、wikiには「ファレイ数列」として載っていますね。確かに人名由来の名称のようです。
>>139では、分数と番号の変換が美しくないと書きましたが、ファレイ分数を、「値」を実態とするところの有理数
と考えるのではなく、「範囲」に対する名称と認識することで、変換を低コストで実現可能であることに気づき、
今回、実際にコード化を試しました。昨夜のプログラムの出力に、「範囲」を載せている所以です。

162132人目の素数さん2018/07/28(土) 23:59:12.30ID:qqQucTqD
>>161
低級レベルの記述をしようと思うんなら、確かに C(あるいはC++)は
よい選択だと思う。おれも元々は数値計算屋で、大規模問題を
貧弱なコンピュータ環境で解く、というのに血道を上げていたので、
そのあたりの感性はよく理解できる。

初等関数の数値計算を行うときに、“CORDIC”という手法があって、
ほぼ乗算程度の計算量で初等関数が最後の桁まで求まる
(必要なのは、 arctan() の数表だけ)んだ。
そういうのが好きだったら、一松 信先生の『初等関数の数値計算』とか
面白いと思うぞ?
あとは森口繁一先生の『数値計算夜話』とか、一松先生の『教室に電卓を!』とか。

おれはプロとしてチーム開発を長年してきたので、「速くする前にわかりやすくしよう」
という観点から、C から Java へ移行したという経緯がある。C のような低レベル
言語だと、「見立て」というか、「こういうことを言いたいんですよ」というのが、
(実行速度との絡みで)伝えにくいという意識がある。
昨今は CPU は速いしメモリ空間もでかいので、「こういうことを
言いたいんですよ」というのがざっくり説明しやすい Java に興味を
持っている。
それに、Java はけっこう C の流儀を引きずっているので、
年寄りとしては、なんとなく安心するところがある。

163132人目の素数さん2018/07/29(日) 00:00:39.46ID:sLBYc3Xd
>>161
あと、「入山のアルゴリズム」でググッてみると、
面白いかもしれないと思う。

164132人目の素数さん2018/07/29(日) 00:10:01.68ID:sLBYc3Xd
>>161
> もし、字下げや、関数の呼び出しのようなスタイルに対するものでしたら、
> 染みついたものですから、しょうが無いですね。
いや、インデントに関しては、個人の趣味の問題なので「好きにしろ」
という立場なんだが、「変数を頭のところで宣言する」というのが
わりと古いスタイルの C に影響されているかもな、と思った。
CPU のレジスタ構成とかを考えると、昔は高速化に貢献していた
部分はあるのだが、昨今のコンパイラの最適化は信用していいと
思う(不安だったら、C のコンパイラはアセンブラのソースを
吐くので、それを読んでみたら安心できると思う)ので、
変数のスコープを明確に示して、人間側のエラーを減らしたほうが、
(あくまで職業的なプログラマの立場から言うのであって、個人が
書くプログラムに関しては、ぶっちゃけ趣味の問題でしかないが)
たぶん長期的にみると効率がいいと思う。
プログラマは「三日前の自分は他人だ」と云うしな。

165132人目の素数さん2018/07/29(日) 11:43:29.27ID:sLBYc3Xd
あと、これは数学板で言うこっちゃないと思うが
(つーても FORTRAN は「数式変換(FORmula TRAMsratpr)」の
略だし、「ALGOL」は、アルゴリズム記述用の言語として定義された
経緯はあるのだが)、
変数名として i, j, k を使うのは、i, j, k, l, m, n(たぶん integer から
natural までだと思う)で始まる変数は、定義されていなくても整数型の
変数だ、という FORTRAN 60 の処理系依存のルールが起源だと思う。
昨今は「局所変数は、使うスコープの中で定義する」というスタイルが
一般的になっていると思う。
このあたり、哲学(論理学)における、自由変項(グローバル変数)と
束縛変項(局所変数。関数引数と、関数内の作業領域が、この代表)に
対応しているので、興味があったらこれらの言葉をキーワードとして
関連図書を漁ってみると楽しいかもしれない。

166132人目の素数さん2018/07/29(日) 13:57:42.94ID:sLBYc3Xd
>>161
いきなり思い出したので書いておくと、
大田区の区議会選挙の話でシャープレイ=シュービック指数を
計算するときに、すべての組合せを生成する(もうちょっと
効率のいい計算法があるはずなんだが、考えるより動かしたほうが
早そうだった)ルーチンが必要になり、その昔書いた「動的ちり集め」の
ロジックをひねくって実装した記憶があった。
ところが、Java には明示的なポインタがない(「参照」は実質的には
ポインタなんだが)ので、swap ができなくてギブアップした経験がある。
そんなわけで、「とりあえず、整列やらなんやらはライブラリに任せて、
中身に関しては(よっぽど遅くなかったら)考えないことにする」と
居直った。
だから、昔の関数電卓を使うと、初等計算の計算より階乗の計算のほうが
あからさまに遅いのを見ると、なんとなく諦念が浮かんでくる。

167132人目の素数さん2018/07/29(日) 19:43:50.09ID:pdqgKo8w

168132人目の素数さん2018/07/29(日) 23:55:46.66ID:U3PTDiLz
色々と面白いお話ありがとうございます。本論からは外れてしまいますが、少しコメント
させてもらうと、FORTRAN、暗黙の宣言文ときたら、私はルンゲクッタ法を思い出してしまいます。
表記の異なる4つの式を、暗黙の宣言文を利用(悪用)して、1ステップの式で表し、
こっそりループに閉じ込めました。そして初見の人に、「これ、ルンゲクッタ法使ってるの?」と
言わしめる悪戯をしていたのを思い出します。

投票力指数については初めて目にしました。順列生成は、覆面算とかのパズル系でよくつかいますが、
このような実用的なところでも利用されていたんですね。勉強になりました。

>> プログラマは「三日前の自分は他人だ」と云うしな。
呂蒙のお話かと思ったけど、「自分が書いたはずの三日前のコードの意図が分からない」的なことですよね。

169132人目の素数さん2018/07/30(月) 08:19:01.00ID:dQ07oWjc
>>168
> そして初見の人に、「これ、ルンゲクッタ法使ってるの?」と
> 言わしめる悪戯をしていたのを思い出します。
N88-BASIC には GOTO と GOSUB というコマンドがあって、
飛び先が両方ともラベルだった。
で、「八人の女王」のプログラムで GOTO と GOSUB と RETURN を
ごっちゃに使って「追っているとだんだん意味不明になって頭を抱える」
というのを書いたことがある。

170132人目の素数さん2018/07/30(月) 12:23:33.15ID:dQ07oWjc
>>168
呂蒙って知らなかった。『男子、三日会わざれば刮目(かつもく)して見よ』
みたいな話じゃなくて、「喉元過ぎれば熱さを忘れる」とか「ニワトリは
三歩歩くと忘れる」程度の話。

ちなみに、ナメクジは思い出した瞬間に冷やすと忘れる、という話が
あるので、「トラウマとかがあった場合、思い出した瞬間に冷やしたら
どうだろう?」みたいな話が昔あった。

171132人目の素数さん2018/07/30(月) 12:27:45.11ID:dQ07oWjc
>>170
日経サイエンス、一九九〇年七月号、P.82、
『冷やすと消えるナメクジの記憶』。

172132人目の素数さん2018/08/01(水) 11:31:52.22ID:vpyCn2wC
なんかこのスレも決着がついちゃった感があるので、
残りを埋める意味で Java のソースでも貼っとくか。
「原始ピタゴラス数」という名前ではなく、
「縦横と対角線の長さが自然数で表される長方形」を
「バビロニア長方形」と呼んでいる。
クラス定義と、縦横の比のコンパレータ。コンテナに突っ込んで
ソートすると、縦横比で整列される。

173132人目の素数さん2018/08/01(水) 11:34:06.40ID:vpyCn2wC
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; // 形状比

174132人目の素数さん2018/08/01(水) 11:34:46.13ID:vpyCn2wC
/*
* コンストラクタ
* @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;
}

175132人目の素数さん2018/08/01(水) 11:35:45.35ID:vpyCn2wC
/*
* 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;
}

176132人目の素数さん2018/08/01(水) 11:36:38.56ID:vpyCn2wC
/*
* 扱いが かなり面倒臭い. 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;
}
}

177132人目の素数さん2018/08/01(水) 11:37:42.11ID:vpyCn2wC
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;
}
}

178132人目の素数さん2018/08/01(水) 11:47:55.04ID:vpyCn2wC
>>128 以降の、プリンプトン322の話は以下のような
感じで確認できる。

179132人目の素数さん2018/08/01(水) 11:48:58.42ID:vpyCn2wC
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);
}
}
}
}
}

180132人目の素数さん2018/08/01(水) 11:49:40.90ID:vpyCn2wC
// ブラーマグプタの公式
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;
}
}
}

181132人目の素数さん2018/08/01(水) 11:57:16.15ID:vpyCn2wC
いくらか足らんところもあるけど、
なんかレスがついたら返事する予定。
でもって適当に age てみる。

182132人目の素数さん2018/08/01(水) 12:03:47.33ID:vpyCn2wC
参考までに、プリンプトン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)

183132人目の素数さん2018/08/04(土) 13:06:41.46ID:Bw0Mcxrs
>>182
120 / 119 = 1.008(1)
90 / 56 = 1.607(15)
φ = 1.618
なんで、1 と 黄金比の間だって気がつかなかったのか、
そっちの方が不思議に思うんだがなぁ。

184132人目の素数さん2018/08/05(日) 19:42:38.81ID:+Do+cqXV
前にも書いたけど、
「11 番と 15 番が、なぜ原始ピタゴラス数ではないのか?」
っちゅーあたりを考えると、古代バビロニア人の
「美学」みたいなものに行き当たるので、
けっこう面白い。

新着レスの表示
レスを投稿する