計算機数学 NO.14

第 14 回目の主題 : ruby でプログラミング

1. 今日すること

ruby でいくつかのプログラミングを行ない、その結果を verbatim を用いて TeX に取り込んで提出せよ。

[figure: • メールの件名は「計算機数学レポート No.14」 . ; • 提出は pdf ファイル。 ; • 不明な点、うまくいかない点がある場合には、該当のファイル ; も添付していただけるとありがたいです。]

2. ヒントと問題

◎ ruby の実行の仕方 (2 通り) irb を実行し、次のいずれかを行えば良い:

(1) 下記のようなプログラムをただひたすら (間違えないように) 打ち込む。 (短いプログラム用。 )

(2) プログラムを a.rb のようなファイルにメモ帳で作成した後、 irb 側で load("a.rb")

と打ち込む。 (長いプログラム用。 ) ◎レベル 1. 1 から 10 までの整数を印字せよ。

for i in 1..10
  p i              ## p は print のこと。
end

◎レベル 2. 1 から 10 までの整数の和を求めよ。

s=0
for i in 1..10
  s=s+i
end
p s

○応用問題 (例): 15 から 100 までの整数の積を求めよ。

[figure]

• ruby が止まらなくなったら Ctrl+C で強制的に終了できる。

• どこが間違いがわからない時は適当にプリント文を挿入してから実行。 • 関数で部分部分に分割するのもよい。

◎レベル 3. 関数を定義し、実行させよ。

def mya   ### mya は "aaa" を表示するだけの関数
  p "aaa"
end
def myb  ###myb は "bbb" を表示するだけの関数
  p "bbb"
end

##### 以下で mya,myb を 10 回実行させることができる。

for i in 1..10
  mya
  myb
end

◎レベル 4. while 文 (繰り返し)

n=100
  while n>=1 do             ### n が 1 以上の間ずっと繰り返す
  p n

n=n/2 ### n を 2 で割った商を改めて n とおく。

end

◎レベル 5.

  def torikae(a,b,n)
    r=n% 2               ### r は c を 2 で割った余り
    if (r== 0 )
      a1=a
    else
      a1=a*b
    end
    b1=b^2
    n1=n/2
    return([a1,b1,n1])
  end

上のように (正しく) 入力した後、 torikae(1,2,5) を実行すると、何が得られるか? ◎利用例 (レベル 6)(レベル 5 の続きに書く。 )

  a,b,n=1,5,1000
  while n>=1
    a,b,n=torikae(a,b,n)   ## このように変数をいっぺんに代入できる。
  end

○一般に正の数 a, b, n をレベル 4 の torikae(a,b,n) で取り替えちゃった後でも ab^{n} の値は変わらないことを納得せよ。 (納得するだけでいい。 ) その後、上のプログラムをうまく変えて ab^{n} を求めるプログラムを作れ。 ◎最終問題 (レベル 7): n = 10^{10} + 19 のとき、 2^{(n−1)/2} を n で割ったあまりを求めよ。

ヒント: レベル 5 のプログラムの計算のそれぞれに、つぎの考えを用いて扱う数をあまり大きくならないようにせよ：

考え整数 a, b と正の整数 m とが与えられたとする。積 ab を m で割ったあまりは、あらかじ

め a, b を m で割ったあまり a_{1}, b_{1} の積 a_{1}b_{1} を m で割ったあまりと等しい。 (もっと一般に、正の整数 m が与えられたとき、 a − a_{1} ∈ mℤ かつ b − b_{1} ∈ mℤ ならば ab − a_{1}b_{1} ∈ mℤ である。 )

なお、積ではなく和や差でも同様のことが成り立つ。 ○付記:

ruby では、 100/3 は 100 を「あまりを許した割り算」で 3 で割った商 (つまり 33) を指すのが標準の動作であるが、場合によっては (プログラム側で動作を指定することにより) 10/3 を分数 (33.333... と等しいアレ) と認識する場合もある。そのような場合、上で 10/3, n/2 などとある部分は、それぞれ 10.div(3), n.div(2) などと書いてやるとよい。