情報科学 Ⅰ 2018

授業中にだされた問題は、解答をその日の23時59分までに提出する。提出先のメールアドレスは授業中に指示する。

件名:情報科学1と授業日   例)情報科学1 0418
本文:学籍番号と氏名           12340231  城山五郎
   解答              答え

4月18日

  1. はじめに  - 授業の資料とクラスについて
  • 問題
    大きな数の階乗を計算してみる。
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 は幾らくらいと言えるだろう。

H30 予算フレーム

第196回国会における麻生財務大臣の財政演説 平成30年1月22日

平成30年度 財政法第46条に基づく国民への財政報告


ソースコード(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<
    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. 単位とはそんざいするもののおのおのがそれによって1とよばれるものである。
  2. 数とは単位から成る多である。
  3. 小さい数が大きい数を割り切るとき、小さい数は大きい数の約数である。
  4. 割り切らないときは約数和である。
  5. そして大きい数が小さい数によって割り切られるとき、大きい数は小さい数の倍数である。
  6. 偶数とは2等分される数である。
  7. 奇数とは2等分されない数、または偶数と単位だけ異なる数である。
  8. 偶数倍の偶数とは偶数で割られて商が偶数になる数である。
  9. 偶数倍の奇数とは奇数で割られて商が偶数になる数である。
  10. 奇数倍の偶数とは奇数で割られて商が偶数になる数である。
  11. 奇数倍の奇数とは奇数で割られて商が奇数になる数である。
  12. 素数とは単位によってのみ割り切られる数である。
  13. 互いに素である数とは共通の尺度としての単位によってのみ割り切られる数である。
  14. 合成数とは何らかの数によって割り切られる数である。
  15. 互いに合成的な(素でない)数とは共通な尺度としての何らかの数によって割り切られる数である。
  16. 数に数をかけるといわれるのは先の数のなかにある単位の数と同じ回数だけかけられる数が加え合わされて何らかの数が生ずるときである。
  17. 二つの数が互いにかけあわせて何らかの数をつくるとき、その積は平面数であり、その辺は互いにかけあわせた数である。
  18. 三つの数が互いにかけあわせて何らかの数をつくるとき、その積は立体数であり、その辺は互いにかけあわせた数である。
  19. 平方数とは等しい数に等しい数をくわえたもの、すなわち二つの等しい数の積である。
  20. 立法数とは等しい数に等しい数をかけ、さらに等しい数をかけたもの、すなわち三つの等しい数の積である。
  21. 第1の数が第2の数の、第3の数が第4の数の同じ倍数であるか、同じ約数であるか、または同じ約数和であるとき、それらの数は比例する。
  22. 相似な平面数および立体数とは比例する辺をもつ数である。
  23. 完全数とは自分自身の約数の和に等しい数である。
  • 定理 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

イスラム帝国の領土拡大のようす 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種類の三角関数がつくられた。

Imgur

出典: 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処理系を起動し、画面にコードを直接入力するのが前者である。

gforth android

練習問題 はじめのほうのいくつかの素数をかけあわせた数の次の数について

次の計算式を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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 5 7 11 13 17 19

うえに書いたアルゴリズムをコードに書き換えやすくするため、プログラム言語にある概念を使ってもう少し、書き直す。

「素数かそうでないか」をブール値 (true, false)で表現する。
「ます目」を配列で表現する。

  1. 2 ... n までの整数について、「素数かそうでないかの判定結果」を入れるために n 個の「ます目」を準備する。ます目には順に2からnまでの番号をつける。
  2. これらのます目の初期値を、すべて「素数である」にしておく。
  3. 整数2から右方向へ、2の倍数かどうかチェックをし、その「ます目」が2の倍数なら「ます目」に「素数でない」を入れる。
  4. 4の操作を、順に配列の終りまで繰り返す。
  5. ...

こうして途中までアルゴリズムを書くと、繰り返しや判定などを正確に記述するには日常言語では、不自由なことに気が付く。

そこで、仮想的なコードでアルゴリズムを記述するのが現在は一般的である。Wikipediaの例を引用する。


参考リンク

エラトステネスのふるい(中国語版)より引用したアルゴリズム(仮想コードで記述)を次に解説する。ただし、このアルゴリズムは、英語版と同じものである。

数論:エラトステネスのふるい(English)


入力: 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 は、yxで割った余りである。

   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 4i.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日


三角数


OEIS, A000217

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, ...

triangular number

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


日常生活でよく使われる各種データの構造を考える。
次のような種類のそれぞれの構造をコンピュータでつくる。

  1. レポート - Report

  2. 表 - Table

  3. リスト - 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


ATF

13 + 23 + 33 + ... + n3 = (1+2+3+ ...+ n)2


The Arithmetic Triangle of Pascal


ATP


フィボナッチ数列とパスカルの三角形の関係


フィボナッチ数列とパスカルの三角形にはある関係があることがわかる。


  • 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(ゼロ)を含むインド・アラビア数字とその計算法をヨーロッパにつたえた。

長いヨーロッパの中世のあいだに発刊されたこの書にでてくる例題を考えてみる。

fibN=: (-&2 +&$: -&1)^:(1&<) M."0
  • goコード

golang big.Int の例

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))) ) ) )

フィボナッチ数列と黄金比(1.618...)φ

エジプト分数

分子が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)

Gottfried Leibniz, 1646-1716

Explanation of binary arithmetic (1703)

2進法と微積分記号

17世紀の数学者ライプニッツ


シンボル

tobias dantzig, 'number - the language of science', plum book, 2007, P.81

number


ゲームとアルゴリズム

Maze 迷路

Sokoban 倉庫番

sokoban.fs

jquery-sokoban

Sokoban solver

2048

gforth


ゴルトン・ボードと統計学 6月13日



微積分学の誕生


古代ギリシアの哲学者たち

Doors to Truth and Falsity

  • エレアのゼノン
  • エレア派と呼ばれた哲学者、パルメニデス
  • エレアは南イタリアにあった貧しいギリシア人植民地

ラッセルは「エレアのゼノンによる論証によって、空間と時間と無限に関するほぼあらゆる理論の基礎が築かれた」

  • プラトンの対話篇『パルメニデス』には、

    • ゼノンは「師パルメニデスの熱意にほだされて若い頃にその本を書いたが、何者かに盗まれてしまったため、公表したくてもできない……その動機は若者の好戦性によるものだった」とある
  • 現代では、アリストテレスの『形而上学』を通じてしか知ることがきない。そこで取り上げられたのは次の4つの議論であった。

    • 2分法
    • アキレスと亀
    • 競技場

無限についてゼノンが考えたこと


J Graphics

Imgur

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

sincosexp

ニュートン、ライプニッツ

  • ニュートン

  • ライプニッツ

    • 微分と積分がたがいに逆演算であることを明確にした。
    • 微分と積分、それぞれのアルゴリズムを確立した。
    • それぞれに適切な記号を発明した。
  • 運動

  • 無限、無限小


ベルヌーイ一族


スイスのバーゼルに住んでいた数学者一族。

ヤコブ ベルヌーイ(Jacob Bernoulli, 1654-1705)

Jacob

e

  • 定数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)

![Johann](https://upload.wikimedia.org/wikipedia/commons/6/6a/Johann_Bernoulli2.jpg)

ニュートン、ライプニッツ 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

pascal

  • 右から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をもとにしています。

空間を埋めつくす曲線の意味で、解析学ではヒルベルト ペアノ曲線とよばれるものです。

Hilbert Peano curve

最初の発見者は、ペアノ(1858ー1932)である。

ペアノ

肖像写真は、Wikipedia よりリンク。

ヒルベルトによる構成法。直線を折り曲げる操作を6回反復したあと。

Hilbert

この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

Imgur

それでは、次の図形のようにするためには、上のコードをどのように変更すればよいだろうか。

Imgur

練習問題

次のコードは、下のような図形を作る。

   viewmat (, ,.~)^:6 ,1
   viewmat (, ,.~)^:3 ,1

その仕組み(アルゴリズム)を考えてみよう。

Imgur
Imgur

繰り返しを1回にするには、次のようにすればよい。

   viewmat (, ,.~)^:1 ,1

Imgur

すると、図形はこのようになる。

ちなみに、数値だけの出力では、

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




Newton method

J Newton

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

prime number race

ガンマ関数

階乗を拡張したガンマ関数の実数部を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


Plot Gamma


Game とアルゴリズム

Sudoku 数独

  • 数独

    • 次の問題をアルゴリズムに基づくコードを使い、コンピュータに解かせてみよう。
    • アルゴリズムとコードは、ここを使用する。

sudoku 1

表の初期値は、つぎのようにして設定する。

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

Skewness and Kurtosis

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

Histogram

順序付きサンプルと組み合わせ

要素 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 暗号

Wikipedia RSA

RSA 暗号

RSA 暗号の例

  • RSA暗号の仕組みと使い方
  1. 任意の100けた以上の素数 p, q
  2. φ=(p-1)(q-1), e --- φとeは、互いに素である。すなわち GCD(φ,e)=1
  3. n = p x q
  4. Public key (e,n)
  5. 1 = d x e mod φ を満すdを求める。
  6. Secret key (n,d)

RSA-129 RSA懸賞金問題

Essays/RSA Challenge

RSA code - Rosetta Code

   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

このままでは、縦軸も単位がなく、横軸の座標も単位がわからない。まず、これを改良してみる。






  • 妖怪ポストに辿りつくためのアルゴリズムは存在するのだろうか?

提出物:レポートはワードなどのアプリで作成し印刷。又は手書きで作成。A4用紙に印刷したものを提出。

提出フォーマット:

学籍番号 氏名 日付
レポート題名

本文

提出期限と受付:7月25日水 09:45 211教室



授業中使用するアプリ

  1. Gforth on Android 0.7.9_20180319
  2. MaximaOnAndroid 3.1 August 5th, 2017
  3. RETRO11 for iOS Retro 11.7.1
  4. 10進BASIC
  5. Free BASIC
  6. BBC BASIC
  7. BBC BASIC Free Evaluation version
  8. PicoLisp

Gforth マニュアル PDF英文

go lang について、インストールとOS環境

golang.org

J System インストール

Windows インストール手順

  • j807_win64.zip をダウンロードする。

  • 圧縮ファイル j807_win64.zip を解凍する。j64-807フォルダができる。

  • Windows エクスプローラを起動する。

  • ダウンロードフォルダをダブルクリックし開く。

  • j64-807 フォルダを見つけ、このフォルダを自分のホーム(例、C:\ユーザ\Hanako)へ移動する。

  • C:\ユーザ\Hanako\j64-807\bin フォルダへ移動する。

  • jconsole.exe をダブルクリックする。

  • セキュリティ警告が表示されるが、「詳細」をクリックしたあと「実行する」。

  • jgray-1 アイコンのコンソールが開く。

  • 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コンソールは閉じる。

J System/Installation_