Lua 目次

このページは、不完全です。Forthのページも見てください。

  1. はじめに
  2. Luaの標準規格について
  3. OS別のLua入手
  4. Sketch Luaプログラムの作成と実行
  5. Sketch Lua コンソール画面
  6. Lua で「数に纏わるアルゴリズム」をプログラムに書く
    1. Fibonacci
  7. 参考書

Luaによる数とアルゴリズムへの招待

はじめに

おわび。iPhone用にForthで書いたプログラムをiPhone用 'Sketch Lua' に書き直しただけ。

Lua の標準規格について

www.lua.org


Lua入手

iPhone, iPad -- iOS

iPhone利用の学生は、Sketch Lua (開発者: Wang Lingling) を入手してください。無料。

iTUnes プレビュー


Sketch Luaでプログラムの作成から実行まで

起動

Sketch Lua アイコンをタップする。

iPad

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
  

Sketch Lua コンソール画面

画面上、右から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

全部の牛の3分の1の3分の2が70頭だとすると、牛は全部で何頭か?

3分の1の3分の2、すなわち全体の9分の2が70頭なら、全部の頭数は2分の9 を70にかければよい。

古代エジプトでは、分数を単位分数の和であらわした

分子が1の分数を単位分数という。エジプトでは、すべての分数を異なる単位分 数の和としてあらわした。ただし、3分の2だけは例外であった。

練習問題 9分の2をエジプトではどう表記しただろうか?
   2/9 = 1/x + 1/y
  

単位分数の分母、xとyを求める。(ヒント) yは、18。

練習問題 紀元前1800年頃のエジプト

古代エジプトの僧侶アーメスが書き記したパピルスに次のようなものがある。

    家   猫    ねずみ   麦    ます    和
    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でゲームをして遊ぶ

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)
 
練習問題 2166 と 6099 の最大公約数は何か?

数学的帰納法

アルゴリズムによる証明
P(n) が整数nについてのある命題とする。P(n)がすべてのnについて正し いことを、次のようにして証明する。
  1. P(1)が正しいことを証明する。
  2. 「もし P(1),P(2),...,P(n) が正しいならば、P(n+1)も正しいこと」を証明する。

例をあげてみよう。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. P(1)は、ただしい。なぜなら 1 = 1の2乗が成り立つから。
  2. P(1),...,P(n)が正しいとすれば、P(n)に(2n+1)を加えると
    	1+3+...+(2n-1)+(2n+1)=nの2乗+2n+1=(n+1)の2乗 となって、
          
    P(n+1)が成立する。(証明終り)
この方法をアルゴリズムによる証明手続きという

16、17、そして18世紀の数学者たち

インドを源流とした数学がアラビアで代数の形式の基礎を得ることができ、 それは16 世紀のイタリアで開花した。17世紀数学は、古代ギリシアの数学 の成果を再評 価するすることにもなる。それはフランスとイギリスで成長 し現代数学の 一分野微積分の誕生へとつながった。微積分は、さらに高い レベルへ抽象化がすすみ、虚数の概念の理解がすすみ解析学から複素解析学 へと発展していく。それには、18世紀の数学者、スイス人やドイツ人であり ながらヨーロッパ大陸をわたり歩いた汎ヨーロッパ的な数学者がいたことを 示す。

スイスのバーゼルには、優秀な数学者を輩出したベルヌーイ一族がいた。 ライプニッツの著作で学んだヤコブ・ベルヌーイは、あたらしい微積分を拡張 した。ライプニッツが使っていた calculus summatoriusという言葉を calculus integralisという言葉に置き換えたのは、ヤコブ・ベルヌーイであっ た。これが「積分」という用語の誕生であった。


> Lua で「数に纏わるアルゴリズム」をプログラムに書く

Fibonacci数列
     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世紀になってもヨーロッパの主要な数学のテキストであった。

黄金分割比 φ = 1.618...
      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