授業中にだされた問題は、解答をその日の23時59分までに提出する。提出先のメールアドレスは授業中に指示する。
件名:情報科学1と授業日 例)情報科学1 0418
本文:学籍番号と氏名 12340231 城山五郎
解答 答え
4月18日
- はじめに - 授業の資料とクラスについて
- 問題
大きな数の階乗を計算してみる。
n n!
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
働きはじめて 10! くらいの年収になってやっと一人前の収入になったとおもうかもしれない。
では、日本の国家予算は、n の階乗計算であらわすと、n は幾らくらいと言えるだろう。
- 参考資料
財務省「平成30年度予算のポイント」
第196回国会における麻生財務大臣の財政演説 平成30年1月22日
ソースコード(source code)の引用元について
Forthをはじめ各種のソースコードを掲載している。リンク先が示されていない場合は、Rosettacode.orgで公開されているコードから動作を確認して掲載している。
プログラム言語 Forth 参考資料
gforth おぼえがき
算数
- .s - スタック内容を示す
-
- , - , * , / , mod - 数の演算子
- /mod - 例 365 7 /mod ... 1 52
*/
-( n1 n2 n3 -- reult) (n1*n2)/n3 例 234 31 100 */
プログラムファイルをgforthシステムに読み込ませる
- s" ファイル名.fs" included
- gforth ファイル名.fs
word(ワード) とコンパイル
- 星印(スター)で四角形を描く。
- ワード star を定義する。コロン記号とセミコロン記号ではさむ。
- コロン直後とセミコロン直前にはスペースを忘れないように入れる。
- 次の例では、star と top が新しいワードとして定義される。
: star 42 emit ;
: top 0 do star loop cr ;
- 42 emit は、スターをスクリーンに1個表示する。42は、スターの文字コード。
- DO ... LOOP
- ワード top は、スター記号プリント動作をある回数反復(do ... loop)し、そのあと改行するよう定義されている。
- star を定義したあと、top を定義している。
- このワード top は、スターを横に並べてある個数表示した後、改行して終了する。10個スターを並べるには次のようにtopの前に10を入れてやる。
10 top **********
ok
条件文
- f IF xxx THEN …… 条件 f が true ならば xxx を実行する。
- f IF xxx ELSE yyy THEN zzz …… 条件 f が false ならば yyy を実行する。条件の真偽にかかわらず zzz は実行される。
- ELSE yyy はオプションである。
-
条件 f のなかでは次のよう演算子がある。
0<
0>
gforth 練習プログラム
- do ... loop 練習
DOループの繰り返しは、DOの前にあるlimitとindexで決まる。
indexは、DOループの中で1単位ずつ増える。
limit index do ... loop
DOループは、ワードの定義中でしか使用できない。日にち、dayを定義してみる。indexは、変数iで参照できる。dayを定義して実行すると例1のようになる。
例1
: day 7 0 do i . loop ;
day 0 1 2 3 4 5 6 ok
定義dayで、do loop の直前にある2つの数は、limit(7) と初期値(0)。
この例1のindex i は、0 1 2 ... limit-1(=6)のように1づつ増加する。
それでは、index を1からはじめるとDOループはどうなるだろうか。
例2
: day 7 1 do i . loop ;
day 1 2 3 4 5 6 ok
変数iは、1からはじまり7を超えない6でDOループは終わる。
-
練習: 1 から 31 を横に表示するワードmay を定義する。縦に表示するにはどうすればよいか。
-
練習: 次のコードを実行した結果をたしかめる。
: sample -212 -222 do i . loop ;
スタック上でDUPを使って3の倍数を計算してみる。
例3
: baisu 11 1 do dup i * . loop ;
3 baisu 3 6 9 12 15 18 21 24 27 30 ok
練習: table を次のように定義して、実行した結果をたしかめる。
: table cr 11 1 do i baisu loop ;
例4
%計算
: % 100 */ ;
234 31 % . 72 ok
例5
星印で長方形
: rectangle 256 0 do i 16 mod 0= if cr then ." *" loop ;
例6
インディアン ボーイズ(歌)
: POEM CR 11 1 DO I . ." Little "
I 3 MOD 0= IF ." indians " CR THEN
LOOP
." indian boys. " ;
4月25日
- nが大きくなるとびっくりするほど巨大になる階乗
n n!
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
「階乗計算」を拡張する。
整数 n が正ならば、n の階乗は次のように計算できる。
1! = 1,
n! = n ✕ (n-1)! となる。
階乗計算をGforthでは、ひとつのワードとして定義することができる。たとえばロゼッタコードには、次のような例がある。
: fac ( n--n! ) 1 swap 1+ 1 ?do i * loop ;
このワードfacを使って、1!から21!までの計算を実行すると次のようになった。
1 fac . 1 ok
2 fac . 2 ok
3 fac . 6 ok
4 fac . 24 ok
5 fac . 120 ok
6 fac . 720 ok
7 fac . 5040 ok
8 fac . 40320 ok
9 fac . 362880 ok
10 fac . 3628800 ok
11 fac . 39916800 ok
12 fac . 479001600 ok
13 fac . 6227020800 ok
14 fac . 87178291200 ok
15 fac . 1307674368000 ok
16 fac . 20922789888000 ok
17 fac . 355687428096000 ok
18 fac . 6402373705728000 ok
19 fac . 121645100408832000 ok
20 fac . 2432902008176640000 ok
21 fac . -4249290049419214848 ok
これを見て、21!が負の数になっているのは、なぜだろうか。どこに原因があるのだろうか。
- 問題 アプリにより数の上限と下限があることを考察する。
しかし、もっと広く数のことを考えると次のような疑問がわいてくる。
n = 16.1
のような小数点を含む数についても、階乗は意味があって計算することが可能だろうか。
n が正の整数での「階乗計算」の性質から、次のような性質を持つ「関数」を考えてみる。
Γ(1) = 1.
Γ(n) = n ・ Γ(n-1), n>=2.
Γとはギリシア文字でガンマと発音する。
ちなみに Maxima
で小数点以下を含む階乗を計算してみた結果は、次のようになった。
(%i1) 10!;
(%o1) 3628800
(%i2) 17!;
(%o2) 355687428096000
(%i3) 16.5!;
(%o3) 8.563497447516255E+13
(%i4) 16.6!;
(%o4) 1.137181457972419E+14
(%i5) 16.51!;
(%o5) 8.809627883610947E+13
(%i6) 16.52!;
(%o6) 9.06288581876808E+13
(%i7) 16.53!;
(%o7) 9.323479140840761E+13
「元来科学思想というものは、これを根本的に理解しなければ役立たないものである。漠然と文字を追って読んだのでは大体の概念を得ることするら不可能であると言ってよろしい。また、たとえ大体の概念を得ることが出来たにもせよ、科学的に物を考えようとするときには、その程度の理解では無力である。」
- 山﨑三郎『数と図形』創元叢書版はしがきより
5月2日、9日、16日 水
はじめに
これから算術やアルゴリズムについて具体的に計算機で実行しながら考える。そして数論の一部についても触れることにする。
「数学の分野の中で、算術と”数論”ほど著しい対照を見せているものはない。・・・算術はその規則性がきわめて一般的かつ簡潔であるため、どんなに鈍い人でも理解できる。むしろ計算能力は、単なる記憶力の問題でしかない。また( X )はあくまでも人間が作った機械であって、機械式計算機に対するその長所の一つは持ち運びの容易さにある」 ートビアス・ダンツィク
『数は科学の言葉』ちくま学芸文庫、2016年6月10日の翻訳では、「Xは電卓」。
原著では、'the lightning calculators'。
原文は、次のようになっている。
No two branches of mathematics present a greater contrast than arithmetic and the Theory of Numbers.
The great generarity and simplicity of its rules makes arithmetic accessible to the dullest mind. In fact, facility in reckoning is merely a matter of memory, and the lightning calculators are but human machines, whose one advantage over the mechanical variety is greater is greater portability.
これはTobias Dantzigによる名著『number the language of science』の第3章冒頭の言葉である。xはわざとあけて置いたが、1930年5月3日の初版への序文から88年も経過した現代でも大筋は万人を納得させるものである。しかし、機械の技術革新はすさまじい。時代によってXは変化すると思える。
ダンツィクは、算術については次のように述べている。
算術は、純粋数学も応用数学も含めすべての数学の土台である。あらゆる科学の中でももっとも有用であり、一般大衆のあいだでこれ以上普及している学問分野はおそらくないであろう。
しかし、ダンツィクは数論について
「あらゆる数学の分野の中でも飛び抜けて難解だ。」「数論は、もっとも応用に乏しい数学分野である。これまで技術の進歩に何ら影響を及ぼしてこなかっただけでなく、・・・孤立した位置を占め、科学全体とはわずかな結びつきしか持っていない。」
と述べている。
さて、算術と数論はどちらがさきに生まれだろうか。文化史を実用化の歴史としてとらえるなら、算術の方が、数の理論よりも先だったと考えるだろう。しかし、事実は逆である。数論の方を算術よりずっと前に人類は考え始めていたのである。
ここで歴史を振り返って、算術や数論という言葉の使われ方をたどってみる。
算術は、英語で arithmetic である。
古代ギリシアでは arithmos が数のことであり arithmetica は数論と呼ばれそれは17世紀まで続いた。いま私達が arithmetic と呼ぶものは、ギリシアでは logistica であって、中世では algorism と呼ばれた。
素数について最初に深く考えたのは古代ギリシアだった
ユークリッド原論
ユークリッド原論の第7巻からは、数論が続く。素数についての考察は第9巻12番目の定理から登場する。
ユークリッド原論の第7巻にある「定義」を『ユークリッド原論』共立出版、2011年から引用する。
第7巻 数論
定義
- 単位とはそんざいするもののおのおのがそれによって1とよばれるものである。
- 数とは単位から成る多である。
- 小さい数が大きい数を割り切るとき、小さい数は大きい数の約数である。
- 割り切らないときは約数和である。
- そして大きい数が小さい数によって割り切られるとき、大きい数は小さい数の倍数である。
- 偶数とは2等分される数である。
- 奇数とは2等分されない数、または偶数と単位だけ異なる数である。
- 偶数倍の偶数とは偶数で割られて商が偶数になる数である。
- 偶数倍の奇数とは奇数で割られて商が偶数になる数である。
- 奇数倍の偶数とは奇数で割られて商が偶数になる数である。
- 奇数倍の奇数とは奇数で割られて商が奇数になる数である。
- 素数とは単位によってのみ割り切られる数である。
- 互いに素である数とは共通の尺度としての単位によってのみ割り切られる数である。
- 合成数とは何らかの数によって割り切られる数である。
- 互いに合成的な(素でない)数とは共通な尺度としての何らかの数によって割り切られる数である。
- 数に数をかけるといわれるのは先の数のなかにある単位の数と同じ回数だけかけられる数が加え合わされて何らかの数が生ずるときである。
- 二つの数が互いにかけあわせて何らかの数をつくるとき、その積は平面数であり、その辺は互いにかけあわせた数である。
- 三つの数が互いにかけあわせて何らかの数をつくるとき、その積は立体数であり、その辺は互いにかけあわせた数である。
- 平方数とは等しい数に等しい数をくわえたもの、すなわち二つの等しい数の積である。
- 立法数とは等しい数に等しい数をかけ、さらに等しい数をかけたもの、すなわち三つの等しい数の積である。
- 第1の数が第2の数の、第3の数が第4の数の同じ倍数であるか、同じ約数であるか、または同じ約数和であるとき、それらの数は比例する。
- 相似な平面数および立体数とは比例する辺をもつ数である。
- 完全数とは自分自身の約数の和に等しい数である。
- 定理 12
もし任意個の数が単位から始まり順次に比例するならば、最後の数がいくつの素数に割り切られようと、その同じ素数によって単位の次の数も割り切られるであろう。
この第9巻の定理12の意味は、 1, a1, a2, …… , an が順次比例する数列で、an が素数 p
で割り切れるならば、a1もまた p
で割り切れる、ということを意味する。
- 素数についての定理は、さらに続き、そうして「素数の系列には終わりが存在するか」という問題に、鋭い洞察力で答えている。
素数のアルゴリズムを調べ、考えるのに便利なJ
Windows では、Jの素数処理命令 p: などにより、他の言語と比較して短いコードで素数のことを調べることができる。
NB. はコメント行
NB. 0番目の素数は2
p: 0
2
NB. 最初の素数10個
p: i.10
2 3 5 7 11 13 17 19 23 29
p: 2018
17569
p: 2019
17573
NB. 逆関数
p:^:_1 17569
p:^:_1 (17569)
2018
エラトステネスのふるいで素数の表をつくる
- アルキメデスと同時代のエラトステネスが整数をならべた表からふるいを使って倍数を消し、素数を残す方法を考え出した、篩(ふるい)法。
素数とアルゴリズム
ここでは実際に、アルゴリズムをコンピュータで実行する。
ドキュメンタリー「宇宙に隠された暗号」
このドキュメンターに2種類のセミの話が登場する。セミは、地上に出るまで地下に長い間もぐっている。ここに登場する2種類のセミは、それぞれ地中にいる期間がちがっている。その稚貝には意味があるというのだが。
素数と生命の寿命には関係があるだろうか。
「アルゴリズム」とは何かをウィキペディア(ウクライナ)を読みながら以下、考えてみる。
アルゴリズム Algorithm
- アルゴリズムという語は、ウズベキスタンの数学者であったアル・フーワリズミ(780-850)(Al-Khwarizmi)の名前に由来していると言われる。
以下の引用は、『数学史』共立出版、2015年より。最大期のイスラム帝国領土図は、アラビア語のウィキペディアより引用した。
7世紀にイスラム帝国が急速に拡大して、これまでと違う文明が発達するが、その中で数学も大きな変化を見せたのだった。慣例に従って、イスラム圏の数学を「アラビアの数学」と総称することにする。西暦622年は唯一神アッラーの預言者マホメットがメッカを離れメディナに逃れた年、すなわちヒジュラ元年である。これが世界史の大きな転換点になった。この後わずか100年ほどの間に、インダス河流域から中央アジア、アラビア、北アフリカを今のスペイン、ポルトガルまでの一大帝国が姿を現す。
イスラム帝国の領土拡大のようす 622-632, 632-661, 661-750
正統派カリフ時代、ウマイヤ朝、アッバース朝、・・・と支配者は変わるが、信仰と言語を共有する大国であり続けた。恐らく、アッラーの前にはすべてが平等という精神がこの急速な大国形成を可能にしたのであろう。
イスラムの数学
8世紀後半にはアッバース朝の下でイスラム文化の最盛期を迎える。バイト・アル・ヒクマ(知恵の館)が作られた平安の都バグダードは、以前のシリアのアンティオキアやペスシアのジュンディー・シャープールに代わって当時の最先端の学問センターになった。学術の保護に熱心だった歴代のカリフ達は、ペルシアや遠くインドからもすぐれた学者たちを集め、それに呼応するようにして富裕な人たちもまた学術文献を競って探し求めたものだ。最初期の市道的な数学者・天文学者はアラル海の南、フーワリズム地方(現ホラズム州)から招かれたムハマンド・イブン・ムーサ・アル=フワーリズミー(Muhanmad ibn Musa Al=Khwarizmi, 780-850)である。
フーワリズム地方
代数学
アル=フワーリズミーの数学の書は、2冊伝わっている。
-
『アル=ジャブルとアル=ムカバラ (Hisab al=jabr w'al=muqabala)
-
『インド数字の計算法 (Algorithmi de numero indorum)
-
ジャブル、ムカバラとは復元と簡約
3x + 5 = 23
3x + 5 - 5 = 23 - 5
3x = 18
3x / 3 = 18 / 3
x = 6
アル=ジャブルのラテン語訳に algebra という言葉が使われ、現代の英語のアルジェブラ(代数学)になった。
方程式を解く方法、手順をアルゴリズム (algorithm)と呼ぶようになった。
次に、アル=フワーリズミーによる2次方程式を解く手順の例を見てみる。
x2 + 10x = 39
(x + 5)2 = 39 + 25 = 64
x + 5 = 8
x = 3
ただし、負の解 -13 は無視されていることに注意。
2次方程式の解法を図解すれば、つぎのようになる。
5 x
+-------------------+----------+
| | |
| 5x | | x
| | |
+-------------------+----------+
| | |
| | |
| 25 | 5x | 5
| | |
| | |
| | |
+-------------------+----------+
3角法
ギリシアの弦(コード)がインドで半弦(ジュヤ)になり、現代のサインとコサインがつくられ、タンジェントなど6種類の三角関数がつくられた。
出典: The Crest of the Peacock
Non-European Roots of Mathematics - Third Edition
George Gheverghese Joseph
イスラム数学では、sine をふくめて全部で6個の3角関数がそろえられた。
sine, cosine, tangent, cotangent, secant, cosecant
代数学、3角法、算用数字による効率的な計算法などのもとがイスラム圏、アラビア人たちによってつくられたことは、ヨーロッパ中心の視点からは見逃されがちな事実である。
シリア、アレッポのFM放送局
Ninar FM
アラビアの数学者には、アル=フワーリズミー(代数学)の他に幾何学や友愛数の研究をしたタービト・イブン・クッラ(830-890)、さらにアルキメデスに匹敵するといわれるイブヌル・ハイサム(965-1039)らたくさんの数学者が出現した。ヨーロッパではこの中世の頃は暗黒時代といわれていることからも数学の発展にアラビア人、イスラム圏が重要な役目を果たした時期があったといえる。
コードの入力方法
アルゴリズムをコード化してコンピュータで実行するためには、コードを直接、その処理系に入力する方法と、コードをファイルにして処理系に渡す方法がある。
- コード直接入力
- コードをファイルにして、処理系に読み込ませる。
スマホでgforth処理系を起動し、画面にコードを直接入力するのが前者である。
練習問題 はじめのほうのいくつかの素数をかけあわせた数の次の数について
次の計算式をForthコードで書き直して入力し、それを実行せよ。さらに、これらの素数をかけあわせた次の数が、素数であるか素数でないかをたしかめよ。
- 計算式:はじめのほうの素数をいくつかかけあわせた数の次の数
2*3+1
2*3*5+1
2*3*5*7+1
2*3*5*7*11+1
2*3*5*7*11*13+1
2*3*5*7*11*13*17+1
- 上の計算式をForthコードで書いた例
2 3 * 1 + .
2 3 5 * * 1 + .
・・・
エラトステネスのふるいにより素数を並べる方法
アルゴリズム
素朴なことばで書いたアルゴリズム
- 素数の定義、1と自分自身でしか割り切れない数。
例で、2から20までを並べる。
2 は定義から素数。
次に2の倍数をふるいにかけて消す。偶数が消える。
ふるいにかけた残りの左端、3は素数。
次に3の倍数をふるいにかけて消す。
残った、 2 3 5 7 11 13 17 19 が20までの素数である。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 34567891011121314151617181920
2 34567891011121314151617181920
2 3 5 7 11 13 17 19
うえに書いたアルゴリズムをコードに書き換えやすくするため、プログラム言語にある概念を使ってもう少し、書き直す。
「素数かそうでないか」をブール値 (true, false)で表現する。
「ます目」を配列で表現する。
- 2 ... n までの整数について、「素数かそうでないかの判定結果」を入れるために n 個の「ます目」を準備する。ます目には順に2からnまでの番号をつける。
- これらのます目の初期値を、すべて「素数である」にしておく。
- 整数2から右方向へ、2の倍数かどうかチェックをし、その「ます目」が2の倍数なら「ます目」に「素数でない」を入れる。
- 4の操作を、順に配列の終りまで繰り返す。
- ...
こうして途中までアルゴリズムを書くと、繰り返しや判定などを正確に記述するには日常言語では、不自由なことに気が付く。
そこで、仮想的なコードでアルゴリズムを記述するのが現在は一般的である。Wikipediaの例を引用する。
参考リンク
エラトステネスのふるい(中国語版)より引用したアルゴリズム(仮想コードで記述)を次に解説する。ただし、このアルゴリズムは、英語版と同じものである。
入力: an integer n > 1
Aをブール値の配列とし, 添字は 整数値 で 2 ... n とする。
配列の全要素を true に初期化する。
for i = 2, 3, 4, ..., not exceeding √n:
if A[i] is true:
for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n :
A[j] := false
出力: A[i] がtrueである i をすべて出力する。
Forth コード
: prime? ( n -- ? ) here + c@ 0= ;
: composite! ( n -- ) here + 1 swap c! ;
: sieve ( n -- )
here over erase
2
begin
2dup dup * >
while
dup prime? if
2dup dup * do
i composite!
dup +loop
then
1+
repeat
drop
." Primes: " 2 do i prime? if i . else ." . " endif loop ;
- Forth コードの実行例
101 sieve
101より小さい整数n(n<101)
について、素数なら数n
を表示し、素数でないなら ピリオド.
を表示するコードである。
$ gforth sieve.fs
Gforth 0.7.2, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
101 sieve Primes: 2 3 . 5 . 7 . . . 11 . 13 . . . 17 . 19 . . . 23 . . . . . 29 . 31 . . . . . 37 . . . 41 . 43 . . . 47 . . . . . 53 . . . . . 59 . 61 . . . . . 67 . . . 71 . 73 . . . . . 79 . . . 83 . . . . . 89 . . . . . . . 97 . . . ok
Goコード
package main
import "fmt"
func main() {
const limit = 301 // means sieve numbers < 301
// sieve
c := make([]bool, limit) // c for composite. false means prime candidate
c[1] = true // 1 not considered prime
p := 2
for {
// first allowed optimization: outer loop only goes to sqrt(limit)
p2 := p * p
if p2 >= limit {
break
}
// second allowed optimization: inner loop starts at sqr(p)
for i := p2; i < limit; i += p {
c[i] = true // it's a composite
}
// scan to get next prime for outer loop
for {
p++
if !c[p] {
break
}
}
}
// sieve complete. now print a representation.
for n := 1; n < limit; n++ {
if c[n] {
fmt.Print(" /")
} else {
fmt.Printf("%3d", n)
}
if n%20 == 0 {
fmt.Println("")
}
}
}
- Goコードの実行例
301より小さい整数について、素数かどうかを判定したリスト。10の倍数で改行。
/ 2 3 / 5 / 7 / / / 11 / 13 / / / 17 / 19 /
/ / 23 / / / / / 29 / 31 / / / / / 37 / / /
41 / 43 / / / 47 / / / / / 53 / / / / / 59 /
61 / / / / / 67 / / / 71 / 73 / / / / / 79 /
/ / 83 / / / / / 89 / / / / / / / 97 / / /
101 /103 / / /107 /109 / / /113 / / / / / / /
/ / / / / /127 / / /131 / / / / /137 /139 /
/ / / / / / / /149 /151 / / / / /157 / / /
/ /163 / / /167 / / / / /173 / / / / /179 /
181 / / / / / / / / /191 /193 / / /197 /199 /
/ / / / / / / / / /211 / / / / / / / / /
/ /223 / / /227 /229 / / /233 / / / / /239 /
241 / / / / / / / / /251 / / / / /257 / / /
/ /263 / / / / /269 /271 / / / / /277 / / /
281 /283 / / / / / / / / /293 / / / / / / /
JavaScript コード
function eratosthenes(limit) {
var primes = [];
if (limit >= 2) {
var sqrtlmt = Math.sqrt(limit) - 2;
var nums = new Array(); // start with an empty Array...
for (var i = 2; i <= limit; i++) // and
nums.push(i); // only initialize the Array once...
for (var i = 0; i <= sqrtlmt; i++) {
var p = nums[i]
if (p)
for (var j = p * p - 2; j < nums.length; j += p)
nums[j] = 0;
}
for (var i = 0; i < nums.length; i++) {
var p = nums[i];
if (p)
primes.push(p);
}
}
return primes;
}
var primes = eratosthenes(100);
console.log(primes);
JavaScript コードの実行(nodejs)
ファイル sieveOfEratosthenes.js からコードを node.js にロードすれば
var primes = eratostenes(100); により100までの整数について素数かどうか
判定し、素数であれば配列 primes に格納される。
結果は、console.log(primes)をもちいて出力される。
- JavaScript コードの実行例
$ node
> .load sieveOfEratosthenes.js
[ 2,
3,
5,
7,
11,
13,
17,
19,
23,
29,
31,
37,
41,
43,
47,
53,
59,
61,
67,
71,
73,
79,
83,
89,
97 ]
undefined
>
配列 primes の内容は要素の番号を指定して見ることができる。
例えば、最初(JavaScriptは0から数える)の素数は、
> primes[0]
2
10番目の素数は、
> primes[10]
31
となる。
- 1..1000 の間にある素数を列挙してみる。
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293
307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397
401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499
503 509 521 523 541 547 557 563 569 571 577 587 593 599
601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691
701 709 719 727 733 739 743 751 757 761 769 773 787 797
809 811 821 823 827 829 839 853 857 859 863 877 881 883 887
907 911 919 929 937 941 947 953 967 971 977 983 991 997
この結果は、下のプログラムによる出力を100づつに修正した。
1からはじめて整数100ずつのなかに素数がいくつあるかをまとめると次のようになる。
N 素数の数
1 .. 100 25
101 .. 200 21
201 .. 300 16
301 .. 400 16
401 .. 500 17
501 .. 600 14
601 .. 700 16
701 .. 800 14
801 .. 900 15
901 ..1000 14
\ primes.4th
\
\ Example code for kForth
\ Copyright (c) 1998 Creative Consulting for Research and Education
\
\ Test for a prime number. Return the largest divisor (< n )
\ and a flag indicating whether the number is prime or not.
: ?prime ( n -- m flag | is n a prime number? )
\ if flag is false (0), m is the largest divisor of n
abs
dup 3 > \ is n > 3 ?
if
dup 2 /mod
swap 0=
if \ is n divisible by 2 ?
nip false
else
1- \ check for divisibility starting
begin \ with n/2 - 1 and counting down
2dup mod
over 1 >
and
while
1-
repeat
nip
dup 1 <=
then
else
dup 1 > IF drop 1 true ELSE false THEN
then
;
: test_prime ( n -- | test for prime number and display result )
?prime
if
." is a prime number" drop
else
." is NOT prime. Its largest divisor is " .
then
cr
;
: list_primes ( n -- | list all the prime numbers from 2 to n )
cr abs
dup 0>
if
1+ 2 do
i ?prime
if
i .
then
drop
loop
else
drop
then
;
Free BASIC の例
DIM n AS Integer, k AS Integer, limit AS Integer
INPUT "Enter number to search to: "; limit
DIM flags(limit) AS Integer
FOR n = 2 TO SQR(limit)
IF flags(n) = 0 THEN
FOR k = n*n TO limit STEP n
flags(k) = 1
NEXT k
END IF
NEXT n
' Display the primes
FOR n = 2 TO limit
IF flags(n) = 0 THEN PRINT n; ", ";
NEXT n
- Free BASIC実行例
Enter number to search to: ? 100
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
J によるエラトステネスのふるい
J では余りを|
で求める。
x|y
は、y
をx
で割った余りである。
2|7
1
xとyがリストのとき、x|/yはあらゆるxとyとについての余りの表(テーブル)をつくる。
2 3 4 |/ 2 3 4
0 1 0
2 0 1
2 3 0
節約のため~
チルダで|
の右辺の数列を左辺に反射させて余りをもとめる。左辺と右辺の数列が同じとき、右辺数列の前に~
を付ければ左辺にも右辺と同じものが反映される。
|/~ 0 1 2 3 4
0 1 2 3 4
0 0 0 0 0
0 1 0 1 0
0 1 2 0 1
0 1 2 3 0
ある数を0で割った余りはその数自身である。(注) 0でない数を0 で割ると、商は無限大。0%0は、0。
0 | 0
0
0 | 1
1
0 | 2
2
数列 0 1 2 3 4 を 0 で割ると 数列 0 1 2 3 4 となり、0行目に出力される。次にこの数列を1で割れば、すべて割り切れるから、0 0 0 0 0となり、1行目に出力される。以下同様に2、3、4で割った余りが2、3、4行目に出力される。
|/~ 0 1 2 3 4
0 1 2 3 4
0 0 0 0 0
0 1 0 1 0
0 1 2 0 1
0 1 2 3 0
0から4までの数列をつくる。i.5
i.5
0 1 2 3 4
|/~ 0 1 2 3 4
をi.5
で短縮し、0の判定'0='をする。
0=|/~ i.5
1 0 0 0 0
1 1 1 1 1
1 0 1 0 1
1 0 0 1 0
1 0 0 0 1
列ごとに要素(0,1)を加算する。
+/0=|/~ i.5
5 1 2 2 3
次に、約数を2個(1と自分)をもつ数だけを見付ける。それが素数である。
2=+/0=|/~ i.5
0 0 1 1 0
1の位置をI.
インデックスで示す。
I.2=+/0=|/~ i.5
2 3
このやり方で次のようにして、100までの素数を示すことができる。
I.2=+/0=|/~ i.100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
このやり方をあたらしい動詞verv
として名前furui
をつけて定義def
する。
furui=: verb def 'I.2=+/0=|/~ i.y'
このfuruiを使って、200までの素数を表示するにはつぎのようにすればよい。
furui 200
しかし、このfuruiには欠陥がある。それは、furui 2を実行すると「空」を出力するかわりに0を表示することだ。
この欠陥を修正するためには、2を排除するために次のfurui1のように書き直す必要がある。
furui1=: verb def 'I.(y>2)*2=+/0=|/~ i.y'
- 長いリストの先端や後端から要素を切り取るやり方。
たとえば、2000までの素数のリストをfurui1 2000で求めると次のようになる。
}: furui1 2000
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 3...
リストが長いために、4行目は中途から省略されている。この最後の5個の素数を見る方法はあるだろうか。どうすればよいかを、リストの後ろから5個を切り取るやり方で示す。
5{. furui1 2000
2 3 5 7 11
_5{. furui1 2000
1979 1987 1993 1997 1999
- 長いリストを、ひらたくというかリストの要素をばらばらにする。
,. furui1 2000
要素の先頭10個を出力する。
10{. ,. furui1 2000
2
3
5
7
11
13
17
19
23
29
要素の後端10個。
_10{. ,. furui1 2000
1931
1933
1949
1951
1973
1979
1987
1993
1997
1999
素数の個数を数える
実際に、コンピュータで1千万、1億、10億までの整数のなかにある素数を数えてみた。素数の個数と数えるのにかかった時間について2つの例をあげておく。
(1) Intel Core i7-6700 CPU @ 3.4GHz
2018/05/08 19:32:24 Test 1: 664579 took 39.540571ms
2018/05/08 19:32:24 Test 2: 5761455 took 570.569602ms
2018/05/08 19:32:31 Test 3: 50847534 took 6.661691644s
(2) AMD Ryzen Threadripper 1920x 12-Core Processor
2018/05/11 11:10:16 Test 1: 664579 took 37.441647ms
2018/05/11 11:10:16 Test 2: 5761455 took 526.497962ms
2018/05/11 11:10:21 Test 3: 50847534 took 5.209150635s
使用したのは、Go言語で書いたこのプログラムである。
プログラムを動かしたコンピュタのCPUのスペックは、(2)の方が高速でCPUのコア数が3倍もあるが、10億までの素数の計算時間に関してはそれほど大きな差はない。コードが同じものを使っているためである。
詳細なCPUについてのlscpu情報は、
(1) Intel i7-6700
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 94
Model name: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
Stepping: 3
CPU MHz: 800.079
CPU max MHz: 4000.0000
CPU min MHz: 800.0000
BogoMIPS: 6816.00
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0-7
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti retpoline intel_pt rsb_ctxsw tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
(2) AMD Ryzen
$ lscpu
アーキテクチャ: x86_64
CPU 操作モード: 32-bit, 64-bit
バイト順序: Little Endian
CPU: 24
オンラインになっている CPU のリスト: 0-23
コアあたりのスレッド数: 2
ソケットあたりのコア数: 12
ソケット数: 1
NUMA ノード数: 1
ベンダー ID: AuthenticAMD
CPU ファミリー: 23
モデル: 1
モデル名: AMD Ryzen Threadripper 1920X 12-Core Processor
ステッピング: 1
CPU MHz: 2058.904
CPU 最大 MHz: 3500.0000
CPU 最小 MHz: 2200.0000
BogoMIPS: 6986.59
仮想化: AMD-V
L1d キャッシュ: 32K
L1i キャッシュ: 64K
L2 キャッシュ: 512K
L3 キャッシュ: 8192K
NUMA ノード 0 CPU: 0-23
フラグ: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid amd_dcm aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca
5月23日、30日
三角数
0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431, ...
1から連続した自然数(1,2,3,4,...)の和が三角数 Tn になることを発見したピタゴラスだった。
T1 = 1, T2 = 1+2=3, T3 = 1+2+3=6, T4 = 1+2+3+4=10
Tn = 1 + 2 + 3 + 4 + … + n = (½)n(n+1)
下図を見ると上の計算を理解しやすい。
x xxxx
xx xxx
xxx xx
xxxx x
- forth コード
: tn 1 do i 1 + i * 2 / . loop ;
10 tn 1 3 6 10 15 21 28 36 45 ok
- JavaScript コード
for(i=1; i<10; i++)
console.log(i*(i+1)/2);
$ node
> .load tn.js
for(i=1; i<10; i++)
console.log(i*(i+1)/2);
1
3
6
10
15
21
28
36
45
undefined
- J コード
q=. 1 2 3 4 5 6 7 8 9 10
q
1 2 3 4 5 6 7 8 9 10
q*(q+1)%2
1 3 6 10 15 21 28 36 45 55
練習問題
1番目の三角数には、1つの点(ドット)がある。では、60番目の三角数にドットはいくつあるだろうか。
練習問題
n番目の三角数の内部のドット数 = (½)n(n+1) が成り立つことを視覚的に証明してみよう。[このサイト](https://www.mathsisfun.com/algebra/triangular-numbers.html)を参考にする。
練習問題
1796年にガウスは、すべての正の整数は、3つの三角数の和で表わせることを発見した。ただし、T<sub>0</sub>=0とする。また、3つの中で同じ三角数をつかってもよい。
num = Δ + Δ + Δ
具体的に、30を3つの三角数の和に分解してみる。13通りある。
28+1+1, 1+28+1, 1+1+28
21+3+6, 21+6+3, 3+21+6, 3+6+21, 6+3+21, 6+21+3
15+15+0, 15+0+15, 0+15+15
10+10+10
しかし、同じ三角数をもちいて順序を変えただけのものがあるため、それらをグループに分けると4種しかないことがわかる。
2020 を 3つの三角数の和で表現せよ。3けたの整数を3つの三角数の和に分解するアルゴリズムとコードを考えてみよう。
参考資料 Write any natural number as sum of three triangular numbers
What Do Perl and Go Have in Common?
J システムについて
インストール方法
- Android
- J Home
- Guide/JAndroid
- J Androidを起動し、 Tools|Package Manager installからすべてのパッケージを選択しインストールする。
- Linux (Debian)
j806_amd64.deb
をダウンロードする- Terminal から
$ sudo dpkg -i j806_amd64.deb
$ sudo ijconsole
- install 'all'
- Windows テキストの終りに解説を載せた。
完全数
ピタゴラスは、自分の各部分(約数)の和に等しい数を完全数と呼んだ。自分自身はふくめないが、1は約数にふくめる。
[Wikipedia 完全数](https://ja.wikipedia.org/wiki/%E5%AE%8C%E5%85%A8%E6%95%B0)
[ブリタニカ百科事典](https://www.britannica.com/science/perfect-number)
はじめの3つの完全数が、6、28、496であることは、次のように確かめることができる。
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
= 16 × 31 = 2^4(2^5 -1)
完全数の歴史
-
ユークリッド原論の第9巻の36に素数と完全数のある関係が述べられ証明されている。
もし単位から始まり順次に1対1の比をなす任意個の数が定められ、それらの総和が素数になるようにされ、そして全体が最後の数にかけられてある数をつくるならば、その積は完全数であろう。
すなわち、
p = 20 + 21 + 22 + 23 + ... + 2n が素数のとき、a = p 2n は完全数である。
公比が2、初項が1の等比数列は、数学の基本のひとつである。
p = 20 + 21 + 22 + 23 + ... + 2n = (1 - 2n+1) / (1 - 2) = 2n+1 - 1.
したがって、ユークリッドによる素数と完全数の関係は、
a = p 2n = (2n+1 - 1)2n
であるから、
(2n - 1)が素数ならば、(2n - 1)2n-1は完全数であるといえる。
たとえば、n=2について確かめる。実際、(22 - 1)=3 は素数であり、(22 - 1)22-1 = (4-1)2 = 6 は、完全数であることがわかる。
練習 n=3より大きな数について、実際に確かめる。
History of the theory of numbers
-
古代ギリシアでは、すでに6、28、496、8128が知られていた。
-
AD100年頃ニコマコスは、偶数を、過剰数(12, 24)と不足数(8, 14)、さらに完全数の3種類に分類した。
-
6, 28, 496, 8128 はそれぞれ10,100,1000,10000の間に登場することから、次に100000までに完全数がひとつ存在するのでは?ということと、完全数の1けた目は6または8であると予想されていた。
-
1456年の文書に5番目の完全数33550336が記載された。
-
カルダーノ(1501ー1576)は完全数はユークリッドが与えた方法ですべて構成されるだろう、と述べた。
- Forth コード
: perfect? ( n -- ? )
1
over 2/ 1+ 2 ?do
over i mod 0= if i + then
loop
= ;
- J コード
is_perfect=: +: = >:@#.~/.~&.q:@(6>.<.)
I. is_perfect i. 100000000
6 28 496 8128 33550336
- Free BASIC コード
Function isPerfect(n As Integer) As Boolean
If n < 2 Then Return False
If n Mod 2 = 1 Then Return False '' we can assume odd numbers are not perfect
Dim As Integer sum = 1, q
For i As Integer = 2 To Sqr(n)
If n Mod i = 0 Then
sum += i
q = n \ i
If q > i Then sum += q
End If
Next
Return n = sum
End Function
Print "The first 5 perfect numbers are : "
For i As Integer = 2 To 33550336
If isPerfect(i) Then Print i; " ";
Algorithm and Data Structure
日常生活でよく使われる各種データの構造を考える。
次のような種類のそれぞれの構造をコンピュータでつくる。
-
レポート - Report
-
表 - Table
-
リスト - List
Jコードをつかって、Report、表、リスト構造をつくる。
i.
は、整数を0から順につくりだす。
例えば、i.6
は 0 から 5 までの 5個の整数リストをつくる。
i.6
0 1 2 3 4 5
5から0までのリストは次のようにしてつくることができる。
i._6
5 4 3 2 1 0
i.2 3 4
は、次のような「3行4列」の「表を2個」つくる。さらに、それらの表へ、0から23までの整数を入れる。
i.2 3 4
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
16 17 18 19
20 21 22 23
-
アルゴリズムとデータ構造 - リスト、表、レポート
- 表 (2行3列)
table =: 2 3 $ 1 3 5 7 9 11
table
1 3 5
7 9 11
1行目は、1 3 5
2行目は、7 9 11
のtableと名前をつけた表ができあがる。
=: は、tableと実体をリンクする。
項目の幅は、自動的に調整される。
ドル記号 $ は、関数である。 ( x $ y )
xで定義された表のセルは、y リストの要素を左から順にとりだして埋められる。
リストの要素の数が足りなくなると、とりだしはまたはじめから繰り返す。
2 3 $ 2 4
2 4 2
4 2 4
- リスト、表、レポートのまとめ
例
リスト 1 3 5 7
表 1 3 5 7
1 9 25 49
レポート 1 3 5 7
1 9 25 49
2 4 6 8
4 16 36 64
- J言語の + - * % ^ などは、英語の動詞(verb)である。それぞれ「加える」「引く」「掛ける」「割る」「べき乗する」動詞である。
1 + 2 + 3
6
2 - 3
_1
-3
_3
6 % 2
3
6 % 3
2
2 ^ 16
65536
- +/ のように+動詞に係る /副詞(adverb)がある。
+/ 1 2 3 4 5
15
- 練習問題 次のコードを実行すれば、ある三角形ができるあがる。これが有名なパスカルの数三角形である。
(i.10) !/ (i.10)
1 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9
0 0 1 3 6 10 15 21 28 36
0 0 0 1 4 10 20 35 56 84
0 0 0 0 1 5 15 35 70 126
0 0 0 0 0 1 6 21 56 126
0 0 0 0 0 0 1 7 28 84
0 0 0 0 0 0 0 1 8 36
0 0 0 0 0 0 0 0 1 9
0 0 0 0 0 0 0 0 0 1
- 数列の和、積などをJで計算するやり方
q=. 2 3 5 7 9 11 数列qを定義
1+2*q 1+2xq を計算
5 7 11 15 19 23
+/ q q全部の和
37
+/\ q q部分和
2 5 10 17 26 37
*/ q q全体の積
20790
*/\ q q部分積
2 6 30 210 1890 20790
- **0,1の2進数のリストを対象に、0か1の判定をするJの動詞 I. **
I. 0 0 1 0 0 0 1
2 6
I. 3
0 0 0
I. 3 1 4 > 1 5 9
0
I. 1 0 0
0
- 約数をもとめる
}. I. (= <.) (% i.@>:) 36
1 2 3 4 6 9 12 18 36
}. I. (= <.) (% i.@>:) 1796
1 2 4 449 898 1796
}. I. (= <.) (% i.@>:) 2018
1 2 1009 2018
}. I. (= <.) (% i.@>:) 1949
1 1949
ヒント
(= <.) (% i.@>:) 36
1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
I. (= <.) (% i.@>:) 36
0 1 2 3 4 6 9 12 18 36
先頭の0を取り除くのは、}.
レオナルド・ピサノ (Leonardo Pisano) Fibonacci (c.1170 - c.1250)
-
通称フィボナッチと呼ばれている個人の本名はレオナルド・ピサノであることがわかっている。19世紀にレオナルドの著作を編集した編集者によると、カッツ『数学の歴史』共立出版にある。
-
Fibonacci = filioBonacci (ボナッチの息子)
The Arithmetic Triangle of Fibonacci
13 + 23 + 33 + ... + n3 = (1+2+3+ ...+ n)2
The Arithmetic Triangle of Pascal
フィボナッチ数列とパスカルの三角形の関係
フィボナッチ数列とパスカルの三角形にはある関係があることがわかる。
- J コード
リストに!/
(i.10)!/i.10
!/~
は、セルフィー( f~ y は y f y と同一)の一種
x=: !/~ i.10
x
1 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9
0 0 1 3 6 10 15 21 28 36
0 0 0 1 4 10 20 35 56 84
0 0 0 0 1 5 15 35 70 126
0 0 0 0 0 1 6 21 56 126
0 0 0 0 0 0 1 7 28 84
0 0 0 0 0 0 0 1 8 36
0 0 0 0 0 0 0 0 1 9
0 0 0 0 0 0 0 0 0 1
+/ x
1 2 4 8 16 32 64 128 256 512
0 , (#x) {. +//. x
0 1 1 2 3 5 8 13 21 34 55
Fibonacci sequence
1202年のレオナルド・ピサノによる『計算の書』ではじめて0(ゼロ)を含むインド・アラビア数字とその計算法をヨーロッパにつたえた。
長いヨーロッパの中世のあいだに発刊されたこの書にでてくる例題を考えてみる。
-
- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...
-
Jコード
fibN=: (-&2 +&$: -&1)^:(1&<) M."0
- goコード
100けたのフィボナッチ数を計算し、素数かどうかの判定をしているコード。
- Lisp コード
PicoLisp のcacheを使って効率化したコード。
(de fibo (N)
(cache '(NIL) N # Use a cache to accelerate
(if (>= 2 N)
N
(+ (fibo (dec N)) (fibo (- N 2))) ) ) )
- **X染色体と先祖の世代数 **
先祖の誰からX染色体をうけついだのだろうか。
フィボナッチ数列と黄金比(1.618...)φ
- 黄金比 Golden Ratio
エジプト分数
分子が1の単位分数の和に置換える。
ef=: 3 : 'if. (=<.) %y do. y else. y (] , ef@-) %1+<.%y end.'
ef 19r20
1r2 1r3 1r9 1r180
- Greedy Algorithm による単位分数の和への置換
6月6日、13日
Gottfried Leipniz (1646 - 1716)
Explanation of binary arithmetic (1703)
2進法と微積分記号
シンボル
tobias dantzig, 'number - the language of science', plum book, 2007, P.81
ゲームとアルゴリズム
Maze 迷路
Sokoban 倉庫番
sokoban.fs
jquery-sokoban
Sokoban solver
2048
gforth
ゴルトン・ボードと統計学 6月13日
微積分学の誕生
古代ギリシアの哲学者たち
- エレアのゼノン
- エレア派と呼ばれた哲学者、パルメニデス
- エレアは南イタリアにあった貧しいギリシア人植民地
ラッセルは「エレアのゼノンによる論証によって、空間と時間と無限に関するほぼあらゆる理論の基礎が築かれた」
-
プラトンの対話篇『パルメニデス』には、
- ゼノンは「師パルメニデスの熱意にほだされて若い頃にその本を書いたが、何者かに盗まれてしまったため、公表したくてもできない……その動機は若者の好戦性によるものだった」とある
-
現代では、アリストテレスの『形而上学』を通じてしか知ることがきない。そこで取り上げられたのは次の4つの議論であった。
- 2分法
- アキレスと亀
- 矢
- 競技場
無限についてゼノンが考えたこと
J Graphics
viewmat
#:
は、2進数に変換する。
#:i.10
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
viewmat は、行列をグラフィックで表示する。
require 'viewmat trig plot'
viewmat #:i.10
viewmat |: #:i.128
viewmat #:(~:/&.#:@, +:)^:(<32) 1
viewmat |: #: *: i.128
viewmat |: #: %: i.128
viewmat |: #: 2^. 1+i.128
viewmat |: #: ^. 1+i.128
viewmat (*:@sind +/ *:@cosd) i.360
plot
load 'plot'
load 'trig'
'key sin(exp),cos(exp)' plot (;(sin,:cos)@:^) -: >: i:3j100
ニュートン、ライプニッツ
-
ニュートン
-
ライプニッツ
- 微分と積分がたがいに逆演算であることを明確にした。
- 微分と積分、それぞれのアルゴリズムを確立した。
- それぞれに適切な記号を発明した。
-
運動
-
無限、無限小
ベルヌーイ一族
スイスのバーゼルに住んでいた数学者一族。
ヤコブ ベルヌーイ(Jacob Bernoulli, 1654-1705)
- 定数eを見つけた、ただしeの名前をつけたのはオイラー。
(1+1%1)^1
2
(1+1%2)^2
2.25
(1+1%3)^3
2.37037
(1+1%4)^4
2.44141
(1+1%10)^10
2.59374
(1+1%50)^50
2.69159
(1+1%100)^100
2.70481
...
- 平方数の逆数の和について、収束することはわかったが、値はわからなかった。
- ここで、わたしたちが、J で1から10までについて、計算するためのやり方を解説する。
まず、i. をつかう。
i.10
0 1 2 3 4 5 6 7 8 9
Jは、0からなのでどうしても0からはじまる。あとで除ける。
逆数は、%i をつかう。
%i.10
_ 1 0.5 0.333333 0.25 0.2 0.166667 0.142857 0.125 0.111111
1個の単下線は、無限大の意味。
平方数には、*:をつかう。
%*:i.10
_ 1 0.25 0.111111 0.0625 0.04 0.0277778 0.0204082 0.015625 0.0123457
ここで、逆数を求めるために先頭の無限大をカットするため、}. をつかう。
}.%*:i.10
1 0.25 0.111111 0.0625 0.04 0.0277778 0.0204082 0.015625 0.0123457
さて、ここで1から10までの平方数の逆数の和をもとめよう。リストの和は、+/
+/}.%*:i.10
1.53977
1.53なにがしとなった。では、100、1000、10000とけたを増やしてみよう。
+/}.%*:i.100
1.63488
+/}.%*:i.1000
1.64393
+/}.%*:i.10000
1.64483
どうやら、1.64 なにがしに近づいている。もうすこし計算してみる。
+/}.%*:i.100000
1.64492
+/}.%*:i.1000000
1.64493
+/}.%*:i.10000000
1.64493
+/}.%*:i.100000000
1.64493
10万けたを超えても、1.64493なにがしでJの標準の有効桁内では収束しているようだ。これ以上の精密な計算はもう少し工夫がいる。とりあえず、ここまでにしておく。
結局のところヤコブは、平方数の逆数の和を正確にもとめることはできなかった。
その値が、なんと驚くべきことに円周率πの2乗を6で割ったものになることを発見したのはベルヌーイらの弟子でもあったオイラーである。それは1735年の出来事であった。苦闘のすえオイラーが発見したとある。
整数の平方数の逆数の和を計算すると、その結果が円周率であらわされることに何か不思議を感じませんか?
円周率は、どこに潜んでいるのでしょう。これも無限に潜む謎のひとつかもしれません。
ちなみに、数全体について次のようなことがわかっています。
個数 逆数和
自然数全体 無限 無限
素数全体 無限 無限
平方数全体 無限 有限でπの2乗割る6
立法数全体 無限 有限
4乗数全体 無限 有限でπの4乗割る90
双子素数全体 無限 有限で1.9021…
黒川信重『オイラー、リーマン、ラマヌジャン』岩波書店、2006年より引用
- 練習問題
平方数の逆数の和は、有限でしかも2よりも小さいことを証明することができる。17世紀にいるつもりで挑戦してみよう。
ヒント: 1/4 をより小さい 1/1・2 、1/9 をより小さい 1/2・3、… に置き換え、不等式をつくる。
ヨハン(1667-1748)

ニュートン、ライプニッツ 6月20日
準備
- ソート
Jでソートは次のようにする。
a=: 10?100
a
89 35 27 29 24 63 21 50 49 70
/:~ a
21 24 27 29 35 49 50 63 70 89
- パスカルの三角形を復習
!/~i.10
1 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9
0 0 1 3 6 10 15 21 28 36
0 0 0 1 4 10 20 35 56 84
0 0 0 0 1 5 15 35 70 126
0 0 0 0 0 1 6 21 56 126
0 0 0 0 0 0 1 7 28 84
0 0 0 0 0 0 0 1 8 36
0 0 0 0 0 0 0 0 1 9
0 0 0 0 0 0 0 0 0 1
- Jは、行列をグラフィックで出力することができる。グラフィック上での各セルは、対応する要素(数値)によって色相が自動的に変化するようになっている。一般に数が小さいのが寒色で、大きくなると暖色系になる。
viewmat !/~i.10
- 右から2列目の黄色のセルは、列
1,8,28,56,70,56,28,8,1
の中央にある数値70に相当する。 - 同じ数値は、グラフィック上で同じ濃度の色になっている。
次に、1から20までのパスカルの3角形を出力してみよう。
!/~i.20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171
0 0 0 1 4 10 20 35 56 84 120 165 220 286 364 455 560 680 816 969
0 0 0 0 1 5 15 35 70 126 210 330 495 715 1001 1365 1820 2380 3060 3876
0 0 0 0 0 1 6 21 56 126 252 462 792 1287 2002 3003 4368 6188 8568 11628
0 0 0 0 0 0 1 7 28 84 210 462 924 1716 3003 5005 8008 12376 18564 27132
0 0 0 0 0 0 0 1 8 36 120 330 792 1716 3432 6435 11440 19448 31824 50388
0 0 0 0 0 0 0 0 1 9 45 165 495 1287 3003 6435 12870 24310 43758 75582
0 0 0 0 0 0 0 0 0 1 10 55 220 715 2002 5005 11440 24310 48620 92378
0 0 0 0 0 0 0 0 0 0 1 11 66 286 1001 3003 8008 19448 43758 92378
0 0 0 0 0 0 0 0 0 0 0 1 12 78 364 1365 4368 12376 31824 75582
0 0 0 0 0 0 0 0 0 0 0 0 1 13 91 455 1820 6188 18564 50388
0 0 0 0 0 0 0 0 0 0 0 0 0 1 14 105 560 2380 8568 27132
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 15 120 680 3060 11628
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 16 136 816 3876
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 17 153 969
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 18 171
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 19
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
|: !/~i.20
x=: !/~i.20
+/ x
ヒルベルト・ペアノ曲線
この解説は、J Studio/Viewmatをもとにしています。
空間を埋めつくす曲線の意味で、解析学ではヒルベルト ペアノ曲線とよばれるものです。
最初の発見者は、ペアノ(1858ー1932)である。
肖像写真は、Wikipedia よりリンク。
ヒルベルトによる構成法。直線を折り曲げる操作を6回反復したあと。
この6番目の図は、次のコードで作りだされる。
require 'viewmat'
hp=: 3 : '(|.,]) 1 (0 _2 _2 ,&.> _2 _1 0 + #y) } (,.|:) y'
MG=: 256 #. 128 0 128,:0 192 0
viewrgb 2 ([ # #"1) MG {~ hp ^:6 [ 0, 0 1 0 ,: 0
練習問題
このコードを少し変形して、1次、2次、3次のヒルベルト・ペアノ曲線を描いてみる。
次のコードにより、下の図形が描かれる。
require 'trig'
viewmat (*:@sind +/ *:@cosd) i.360
それでは、次の図形のようにするためには、上のコードをどのように変更すればよいだろうか。
練習問題
次のコードは、下のような図形を作る。
viewmat (, ,.~)^:6 ,1
viewmat (, ,.~)^:3 ,1
その仕組み(アルゴリズム)を考えてみよう。
繰り返しを1回にするには、次のようにすればよい。
viewmat (, ,.~)^:1 ,1
すると、図形はこのようになる。
ちなみに、数値だけの出力では、
1 0
1 1
である。1を白、0を黒の2値でviewmatは出力していることがわかる。
繰り返し2回、3回の2進出力は、次のようになる。
(, ,.~)^:2 ,1
1 0 0 0
1 1 0 0
1 0 1 0
1 1 1 1
(, ,.~)^:3 ,1
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 0 0 0 1 0 0 0
1 1 0 0 1 1 0 0
1 0 1 0 1 0 1 0
1 1 1 1 1 1 1 1
ニュートン法 6月27日
ニュートン法あるいはニュートン・ラフソン法とも呼ばれている、非線形方程式の解を近似的に求めるアルゴリズム。
i:10
_10 _9 _8 _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 8 9 10
x=:i:10
x2=: *:x
x2
100 81 64 49 36 25 16 9 4 1 0 1 4 9 16 25 36 49 64 81 100
x3=: x2*x
x3
_1000 _729 _512 _343 _216 _125 _64 _27 _8 _1 0 1 8 27 64 125 216 343 512 729 1000
y=: x3 - (2*x) -5
y
_975 _706 _491 _324 _199 _110 _51 _16 1 6 5 4 9 26 61 120 209 334 501 716 985
plot y
f'(xn) = Δy / Δx = {f(xn) - 0} / {xn - xn+1}
xn - xn+1 = f(xn) / f'(xn)
2の平方根をニュートン法でもとめるため、次の2次方程式を解く。
-2 + x2 = 0
はじめに、Nを定義する。Nの定義右辺の u には以下の計算で関数 f(x) が入り、それを分子にし、分母は、 f(x) を微分(d.) した f'(x) で割る(%)。
N=: 1 : '- u % u d. 1'
(_2 + *:) N 1
1.5
(_2 + *:) N^:2 ]1
1.41667
(_2 + *:) N^:3 ]1
1.41422
(_2 + *:) N^:_ ]1
1.41421
2 - *: (_2 + *:) N^:_ ]1
4.44089e_16
2 - *: (_2 + *:) N^:2 ]1
_0.00694444
2 - *: (_2 + *:) N^:3 ]1
_6.0073e_6
2 - *: (_2 + *:) N^:4 ]1
_4.51061e_12
無限回_
繰り返すと、誤差は10のー16乗程度になることがJコードの計算でわかる。
`N 1` 1回
`N^:2` 2回
`N^:3` 3回
...
`N^:_` 無限回
- 有理数
(_2 + *:) N^:(i.8) 1x
1 3r2 17r12 577r408 665857r470832 886731088897r627013566048 1572584048032918633353217r1111984844349868137938112 4946041176255201878775086487573351061418968498177r3497379255757941172020851852070562919437964212608
ここままでは見にくいので、,.
でリストをばらす。
,. (_2 + *:) N^:(i.8) 1x
1
3r2
17r12
577r408
665857r470832
886731088897r627013566048
1572584048032918633353217r1111984844349868137938112
4946041176255201878775086487573351061418968498177r3497379255757941172020851852070562919437964212608
分数を小数にする。
0j70 ": ,. (_2 + *:) N^:(i.8) 1x
1.0000000000000000000000000000000000000000000000000000000000000000000000
1.5000000000000000000000000000000000000000000000000000000000000000000000
1.4166666666666666666666666666666666666666666666666666666666666666666667
1.4142156862745098039215686274509803921568627450980392156862745098039216
1.4142135623746899106262955788901349101165596221157440445849050192000544
1.4142135623730950488016896235025302436149819257761974284982894986231958
1.4142135623730950488016887242096980785696718753772340015610131331132653
1.4142135623730950488016887242096980785696718753769480731766797379907325
2の平方根がどのくらいの精度で求められたのかをチェックする。
2 - *: (_2 + *:) N^:(i.8) 1x
1 _1r4 _1r144 _1r166464 _1r221682772224 _1r393146012008229658338304 _1r1236510294063800469693771621893337765354742124544 _1r12231661658605970488646702209964173639623045564667134286386925224636805727742126817029345426161664
0j_3 ": 2 - *: (_2 + *:) N^:(i.8) 1x
1.000e0 _2.500e_1 _6.944e_3 _6.007e_6 _4.511e_12 _2.543e_24 _8.087e_49 _8.175e_98
この結果からおよそ小数点以下98桁までの精度で計算できたことがわかる。
素数 prime number race
4で素数を割り算した余りが3になるか1になるか。どちらが多いか?
808000番目から812000番目までの素数について調べると図のようになる。
p: 808000 812000
12325063 12390403
primerace=: [: +/\ _2 + 4 | p:
plot 808000 }.each (;primerace) i.812000
ガンマ関数
階乗を拡張したガンマ関数の実数部を3D表示する。
gamma=: !@<:
real=: {.@+.
x=: steps _3.5 4.5 40
y=: steps _1 1 40
z=: real gamma x j./ y
dat=: _3 >. 12 <. z
'surface;noaxes;viewpoint _1 _2.5 1' plot dat
Game とアルゴリズム
Sudoku 数独
表の初期値は、つぎのようにして設定する。
x=: , 0&".;._2 (0 : 0)
5 8 2 3 9 1 0 0 0
0 0 0 0 2 7 0 0 0
7 0 0 8 0 5 1 9 2
0 6 1 0 8 0 0 0 5
9 7 0 0 0 0 0 3 4
2 0 0 0 5 0 6 1 0
4 5 9 1 0 8 0 0 7
0 0 0 6 4 0 0 0 0
0 0 0 5 7 2 9 4 8
統計
dstat
乱数を発生させ、それを統計処理する。
実行例
load 'stats'
dstat ? 20#100
sample size: 20
minimum: 0
maximum: 97
median: 41.5
mean: 42.45
std devn: 30.5812
skewness: 0.0904037
kurtosis: 1.81008
histogram
データの出現頻度を示す。その数値をグラフ化する。
実行例
d=: +/10 1e6 ?.@$ 20
e=: 5 * i.40
h=: e histogram d
$ h
40
h
0 0 0 0 4 17 64 225 701 1641 3799 7780 14435 24394 37854 53690 70978 87867 100468 106725 106176 97759 85084 68168 50094 35000 21790 12937 6757 3369 1455 538 181 39 11 0 0 0 0 0
plot e;h
順序付きサンプルと組み合わせ
要素 ai が n 個の集団を考える。ここで、1 ≦ i ≦ n.
a1,a2, … ,an
この要素が n 個の集団から r 個をサンプリングする場合の数をかぞえるとき、同じ要素をサンプルとして何回も取り出すことができる場合とそうでない場合、すなわち一度サンプルとされたものは集団から取り除かれる場合の2つに分ける。
- 前者の場合は、サンプルの選択方法が、それぞれ n 通りであるから、 n個の集団から r 個をサンプリングすると nr 通りとなる。
- 後者の場合は、1回目の選択肢は n通り、2回目は n-1通り、3回目は n-2通り ...であるから、n個の集団から r 個をサンプリングすると n(n-1)(n-2)...(n-r+1)通りとなる。
RSA 暗号
RSA 暗号の例
- RSA暗号の仕組みと使い方
- 任意の100けた以上の素数 p, q
- φ=(p-1)(q-1), e --- φとeは、互いに素である。すなわち GCD(φ,e)=1
- n = p x q
- Public key (e,n)
- 1 = d x e mod φ を満すdを求める。
- Secret key (n,d)
N=: 9516311845790656153499716760847001433441357x
E=: 65537x
D=: 5617843187844953170308463622230283376298685x
] text=: 'Rosetta Code'
Rosetta Code
] num=: 256x #. a.i.text
25512506514985639724585018469
num >: N NB. check if blocking is necessary (0 means no)
0
] enc=: N&|@^&E num
916709442744356653386978770799029131264344
] dec=: N&|@^&D enc
25512506514985639724585018469
] final=: a. {~ 256x #.inv dec
Rosetta Code
情報科学レポート課題
テーマは、次のなかからひとつを選択しレポートを作成する。
- 数列と図形のアルゴリズムについて(例:パスカルの三角形とフィボナッチ数列の関係)
紀元前5500年頃のサマッラ (イラク)の土器に三角形数が模様として描かれている。数と図形に規則性を発見した事実は古代にまでさかのぼることができる。図形の美しさと数についての規則を発見するきっかけになった。
ギリシアのピラゴラスの発見とされる定理も、古代バビロニアにさかのぼる。
- 迷路あるいは倉庫番ゲームのアルゴリズムについて、コードを作成、修正、実行することにより考察する
- 松山市の人口動態をコード(J言語など)によりグラフ作成などで分析し人口問題を考察する
松山市の人口動態
例えば、昭和47年からためしに10年間の人口(千人単位)のデータをplotしてみる。
load 'plot'
plot c=: 333 342 350 358 369 376 388 394 403 409
このままでは、縦軸も単位がなく、横軸の座標も単位がわからない。まず、これを改良してみる。
- ソーシャルネットを代表するひとつとしてインスタグラムのアルゴリズムを考察する
InstagramのアルゴリズムをInstagramのチームが詳しく説明
How Instagram’s algorithm works
- 細胞農業の現状と将来について考察する
古代ギリシアからの菜食主義にもその起源があるともいわれる人工的に食物を育てる細胞農業の動向を知る。
菜食主義の歴史
一般に牛などの肉は野菜と比べて高いが、現在細胞農業によってつくられる食肉はさらに高価で市販には至らない。それを牛の肉と比較できる価格にしようとする動きが産業界ではじまった。
Wikipedia:細胞農業
インテグリカルチャーの資金調達
ベジタリアン・ミート
素肉
بدائل اللحوم
- 妖怪ポストに辿りつくためのアルゴリズムは存在するのだろうか?
提出物:レポートはワードなどのアプリで作成し印刷。又は手書きで作成。A4用紙に印刷したものを提出。
提出フォーマット:
学籍番号 氏名 日付
レポート題名
本文
提出期限と受付:7月25日水 09:45 211教室
授業中使用するアプリ
- Gforth on Android 0.7.9_20180319
- MaximaOnAndroid 3.1 August 5th, 2017
- RETRO11 for iOS Retro 11.7.1
- 10進BASIC
- Free BASIC
- BBC BASIC
- BBC BASIC Free Evaluation version
- PicoLisp
Gforth マニュアル PDF英文
go lang について、インストールとOS環境
J System インストール
Windows インストール手順
-
j807_win64.zip をダウンロードする。
-
圧縮ファイル j807_win64.zip を解凍する。j64-807フォルダができる。
-
Windows エクスプローラを起動する。
-
ダウンロードフォルダをダブルクリックし開く。
-
j64-807 フォルダを見つけ、このフォルダを自分のホーム(例、C:\ユーザ\Hanako)へ移動する。
-
C:\ユーザ\Hanako\j64-807\bin フォルダへ移動する。
-
jconsole.exe をダブルクリックする。
-
セキュリティ警告が表示されるが、「詳細」をクリックしたあと「実行する」。
-
アイコンのコンソールが開く。
-
Jコンソール画面で、インストーラを次のように数行の命令をタイプして起動させる。load のあと、JQTが不要ならJQT=:0 、デスクトップにショートカットを置かないならSHORTCUTS=:0 の命令行をそれぞれタイプする。
- load '~addons/ide/jhs/installer.ijs'
- installer 0
-
Jのアップデート、パッケージのインストールがはじまる。
load '~addons/ide/jhs/installer.ijs'
JQT=:0
SHORTCUTS=:0
installer 0
these steps can take several minutes
Updating server catalog...
Installing 122 packages
Downloading api/expat...
Installing api/expat...
Downloading api/gles...
Installing api/gles...
Downloading api/jc...
Installing api/jc...
Downloading api/jni...
Installing api/jni...
Downloading api/lapacke...
Installing api/lapacke...
Downloading api/ncurses...
Installing api/ncurses...
Downloading api/python3...
Installing api/python3...
Downloading arc/zip...
Installing arc/zip...
Downloading arc/ziptrees...
Installing arc/ziptrees...
Downloading arc/zlib...
Installing arc/zlib...
Downloading convert/jiconv...
Installing convert/jiconv...
Downloading convert/json...
Installing convert/json...
Downloading convert/misc...
Installing convert/misc...
Downloading convert/pjson...
Installing convert/pjson...
Downloading data/ddmysql...
Installing data/ddmysql...
Downloading data/ddsqlite...
Installing data/ddsqlite...
Downloading data/jd...
Installing data/jd...
Downloading data/jfiles...
Installing data/jfiles...
Downloading data/jmf...
Installing data/jmf...
Downloading data/odbc...
Installing data/odbc...
Downloading data/sqlite...
Installing data/sqlite...
Downloading data/sqltable...
Installing data/sqltable...
Downloading debug/dissect...
Installing debug/dissect...
Downloading debug/jig...
Installing debug/jig...
Downloading debug/lint...
Installing debug/lint...
Downloading debug/tte...
Installing debug/tte...
Downloading demos/coins...
Installing demos/coins...
Downloading demos/isigraph...
Installing demos/isigraph...
Downloading demos/publish...
Installing demos/publish...
Downloading demos/qtdemo...
Installing demos/qtdemo...
Downloading demos/wd...
Installing demos/wd...
Downloading demos/wdplot...
Installing demos/wdplot...
Downloading docs/help...
Installing docs/help...
Downloading docs/joxygen...
Installing docs/joxygen...
Downloading finance/actuarial...
Installing finance/actuarial...
Downloading finance/interest...
Installing finance/interest...
Downloading format/datefmt...
Installing format/datefmt...
Downloading format/printf...
Installing format/printf...
Downloading format/publish...
Installing format/publish...
Downloading format/sbox...
Installing format/sbox...
Downloading format/zulu...
Installing format/zulu...
Downloading format/zulu-bare...
Installing format/zulu-bare...
Downloading format/zulu-lite...
Installing format/zulu-lite...
Downloading games/2048...
Installing games/2048...
Downloading games/minesweeper...
Installing games/minesweeper...
Downloading games/nurikabe...
Installing games/nurikabe...
Downloading games/pousse...
Installing games/pousse...
Downloading games/solitaire...
Installing games/solitaire...
Downloading general/dirtrees...
Installing general/dirtrees...
Downloading general/dirutils...
Installing general/dirutils...
Downloading general/inifiles...
Installing general/inifiles...
Downloading general/jod...
Installing general/jod...
Downloading general/joddocument...
Installing general/joddocument...
Downloading general/jodsource...
Installing general/jodsource...
Downloading general/misc...
Installing general/misc...
Downloading general/primitives...
Installing general/primitives...
Downloading general/unittest...
Installing general/unittest...
Downloading graphics/afm...
Installing graphics/afm...
Downloading graphics/bmp...
Installing graphics/bmp...
Downloading graphics/cairo...
Installing graphics/cairo...
Downloading graphics/color...
Installing graphics/color...
Downloading graphics/d3...
Installing graphics/d3...
Downloading graphics/fvj4...
Installing graphics/fvj4...
Downloading graphics/gl2...
Installing graphics/gl2...
Downloading graphics/gnuplot...
Installing graphics/gnuplot...
Downloading graphics/graph...
Installing graphics/graph...
Downloading graphics/jpeg...
Installing graphics/jpeg...
Downloading graphics/pdfdraw...
Installing graphics/pdfdraw...
Downloading graphics/plot...
Installing graphics/plot...
Downloading graphics/png...
Installing graphics/png...
Downloading graphics/pplatimg...
Installing graphics/pplatimg...
Downloading graphics/print...
Installing graphics/print...
Downloading graphics/treemap...
Installing graphics/treemap...
Downloading graphics/viewmat...
Installing graphics/viewmat...
Downloading gui/cobrowser...
Installing gui/cobrowser...
Downloading ide/jnet...
Installing ide/jnet...
Downloading ide/qt...
Installing ide/qt...
Downloading labs/labs...
Installing labs/labs...
Downloading math/cal...
Installing math/cal...
Downloading math/deoptim...
Installing math/deoptim...
Downloading math/eigenpic...
Installing math/eigenpic...
Downloading math/fftw...
Installing math/fftw...
Downloading math/lapack...
Installing math/lapack...
Downloading math/misc...
Installing math/misc...
Downloading math/mt...
Installing math/mt...
Downloading math/tabula...
Installing math/tabula...
Downloading math/uu...
Installing math/uu...
Downloading media/imagekit...
Installing media/imagekit...
Downloading media/videolabs...
Installing media/videolabs...
Downloading media/wav...
Installing media/wav...
Downloading misc/classroom...
Installing misc/classroom...
Downloading misc/miscutils...
Installing misc/miscutils...
Downloading net/clientserver...
Installing net/clientserver...
Downloading net/jcs...
Installing net/jcs...
Downloading net/websocket...
Installing net/websocket...
Downloading net/zmq...
Installing net/zmq...
Downloading profiles/profiles...
Installing profiles/profiles...
Downloading sockets/socklib...
Installing sockets/socklib...
Downloading sockets/sockutils...
Installing sockets/sockutils...
Downloading stats/base...
Installing stats/base...
Downloading stats/distribs...
Installing stats/distribs...
Downloading stats/jserver4r...
Installing stats/jserver4r...
Downloading stats/r...
Installing stats/r...
Downloading stats/rlibrary...
Installing stats/rlibrary...
Downloading tables/csv...
Installing tables/csv...
Downloading tables/dsv...
Installing tables/dsv...
Downloading tables/excel...
Installing tables/excel...
Downloading tables/tara...
Installing tables/tara...
Downloading tables/taraxml...
Installing tables/taraxml...
Downloading tables/wdooo...
Installing tables/wdooo...
Downloading types/datetime...
Installing types/datetime...
Downloading web/gethttp...
Installing web/gethttp...
Done.
- exit 0 で、Jコンソールは閉じる。