このページは、不完全です。Forthのページも見てください。
おわび。iPhone用にForthで書いたプログラムをiPhone用 'Sketch Lua' に書き直しただけ。
iPhone利用の学生は、Sketch Lua (開発者: Wang Lingling) を入手してください。無料。
Sketch Lua アイコンをタップする。
iPadを持っているひとは、TouchLua+の方が機能が多いため良いかもしれ ません。
Jupiter ACEでForthを動かすこともできます。
画面上左はしの、フォルダアイコンをタップ。次「+」をタップ。ファイル名を 「Fibonacchi」のように内容がわかるようにつけ、プログラムを書く。
function fib(n) return n < 2 and n or fib(n-1) + fib(n-2) end for i=1,10 do print(fib(i)) end
フィボナッチ数を1番目から10番目までの結果が画面に表示される。
1 1 2 3 5 8 13 21 34 55
画面上、右から2番目のコンソールアイコンをタップする。
2 + 17 2 - 17 2 * 17 2 / 17 2 // 17 17 // 2 2 % 17 17 % 2 2^8 2^(0.5)
わり算には、浮動小数点によるもの(/)と小数点以下切り捨て(//) の2つがある。
余りは、%記号。
/は、除数、被除数ともに浮動小数点形式にして商を求める。べき乗(^)は、 小数も計算できる。、
次の結果は、どうなる?
2^64
e+19 は、1のあとに0が19個。
全部の牛の3分の1の3分の2が70頭だとすると、牛は全部で何頭か?
3分の1の3分の2、すなわち全体の9分の2が70頭なら、全部の頭数は2分の9 を70にかければよい。
分子が1の分数を単位分数という。エジプトでは、すべての分数を異なる単位分 数の和としてあらわした。ただし、3分の2だけは例外であった。
2/9 = 1/x + 1/y
単位分数の分母、xとyを求める。(ヒント) yは、18。
古代エジプトの僧侶アーメスが書き記したパピルスに次のようなものがある。
家 猫 ねずみ 麦 ます 和 7 49 343 2401 16807 19607
この数字は、なにを意味しているのだろうか?
(ヒント)
Lua で次のような計算をやってみて結果が導きだされた過程を考えよ う。次にどのようにすれば、和がえられるか計算式を考えて実行してみよう。
7 7^2 7^3 7^4
アーメスは、7のベキ乗を具体的に計算したのかもしれない。家が7軒、1軒の家には猫が7匹、1匹の猫は7匹のねずみを捕まえ、1匹のねずみは7本の麦を食い、……
しかし、単位が異なるものを加算する「和」に意味があるのかどうかは 無視して計算する。算術の問題を、身近にするために家、猫、ねずみ、麦、 ますと書いたのだろうか?
13世紀のフィボナッチ(ピサのレオナルド)が書いた『算盤書』にも、同 じ問題がある。フィボナッチは、アーメスのパピルスを知っていたのだろう か。
n = 1024 repeat print(n) n = n//2 until n == 0
$ lua repeat-until.lua 1024 512 256 128 64 32 16 8 4 2 1
function test(n) if n == 0 then print("ok") else print("ゼロとちがう!") end end test(0) test(-17)
Lua では、Gforth用の tt.fs (テトリス)と似たアスキー文字だけの図形で遊 べる termtris がある。
ただし、 iPhone Lua ではテトリスをまだ試していない。
Linux ターミナルでの画面
整数が二つあるとき。二つとも割り切る正の数を公約数という。公 約数のうち最大のものを最大公約数という。二つの整数を a、bとするとき、 もしbがaを割り切るならば、aとbの最大公約数はbである。
整数 a,b の最大公約数を求める。
1. a を b で割り、余りを r とする。(0 ≦ r < b) 2. もし、r=0 ならば b が最大公約数である。 3. a ← b, b ← r とし、1 に戻る。
プログラム
function gcd(a,b) if b ~= 0 then return gcd(b, a % b) else return a end end gcd(544, 119)
例をあげてみよう。1からはじまる奇数の和を計算する簡単な式が予想でき る。
1 = 1の2乗 1+3 = 2の2乗 1+3+5 = 3の2乗 1+3+5+7 = 4の2乗 1+3+5+7+9 = 5の2乗
そこで一般的な法則をたてる。
1+3+ ... +(2n-1) = nの2乗
このnについての一般的な式をP(n)としよう。P(n)がすべての整数nにつ いて成り立つことを証明できるだろうか。
1+3+...+(2n-1)+(2n+1)=nの2乗+2n+1=(n+1)の2乗 となって、P(n+1)が成立する。(証明終り)
インドを源流とした数学がアラビアで代数の形式の基礎を得ることができ、 それは16 世紀のイタリアで開花した。17世紀数学は、古代ギリシアの数学 の成果を再評 価するすることにもなる。それはフランスとイギリスで成長 し現代数学の 一分野微積分の誕生へとつながった。微積分は、さらに高い レベルへ抽象化がすすみ、虚数の概念の理解がすすみ解析学から複素解析学 へと発展していく。それには、18世紀の数学者、スイス人やドイツ人であり ながらヨーロッパ大陸をわたり歩いた汎ヨーロッパ的な数学者がいたことを 示す。
スイスのバーゼルには、優秀な数学者を輩出したベルヌーイ一族がいた。 ライプニッツの著作で学んだヤコブ・ベルヌーイは、あたらしい微積分を拡張 した。ライプニッツが使っていた calculus summatoriusという言葉を calculus integralisという言葉に置き換えたのは、ヤコブ・ベルヌーイであっ た。これが「積分」という用語の誕生であった。
1 1 2 3 5 8 13 21 34 55 89 ...
詳細は、各種整数列オンライン百科事典のOEIS A000045にある。
アルゴリズム
F(1) = 1 F(2) = 1 F(n) = F(n-1) + F(n-2)
プログラム
function fib(n) return n < 2 and n or fib(n-1) + fib(n-2) end for i=1,10 do print(fib(i)) end
参考として Swift 言語で書いた、フィボナッチ数列を1項から30項まで計 算するプログラムを次に示す。1から7行は、関数(func)の定義である。関数 名は fibonacci 、引数として 整数(Int) n をあたえれば、その結果を整数 で返す( -> Int)。
func fibonacci(n: Int) -> Int { if n < 2 { return n } else { return fibonacci(n-1) + fibonacci(n-2) } } for i in 1...30 { print(fibonacci(i)) }
(解説)
フィボナッチ(ボナッチの息子)は、イタリア、ピサのレオナルド(1170頃ー 1250)という人物。数学者として何冊も本を書いた。そのうちの1冊『算盤の書』は、19世紀になってもヨーロッパの主要な数学のテキストであった。
function fib(n) return n < 2 and n or fib(n-1) + fib(n-2) end for i=1,20 do print(fib(i),fib(i+1),fib(i+1)/fib(i))
正の整数で、自分自身の約数の和が自分自身になる数。ただし、自分自身 は約数にふくめない。
アルゴリズム
プログラム
function isPerfect(x) local sum = 0 for i = 1, x-1 do sum = (x % i) == 0 and sum + i or sum end return sum == x end
実行方法
> dofile("perfect-number.lua") > isPerfect(6) true