next up previous
Next: About this document ... Up: 計算機数学 No.14 Previous: 今日すること

ヒントと問題

◎ 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 までの整数の積を求めよ。

  • 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) で取り替えちゃった後でも $ a b^n$ の値は 変わらないことを納得せよ。(納得するだけでいい。)その後、 上のプログラムをうまく変えて$ a b^n$ を求めるプログラムを作れ。

◎最終問題 (レベル7): $ n=10^{10}+19$ のとき、 $ 2^{(n-1)/2}$$ n$ で割ったあまりを求めよ。

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

\fbox{考え}

整数 $ a,b$ と正の整数 $ m$ とが与えられたとする。積 $ a b$$ m$ で割ったあまりは、あらかじめ $ a,b$$ m$ で割ったあまり $ a_1,b_1$ の 積 $ a_1 b_1$$ m$ で割ったあまりと等しい。 (もっと一般に、正の整数 $ m$ が与えられたとき、 $ a-a_1\in m {\mbox{${\mathbb{Z}}$}}$ かつ $ b-b_1\in m{\mbox{${\mathbb{Z}}$}}$ ならば $ ab-a_1 b_1\in m{\mbox{${\mathbb{Z}}$}}$ である。)

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

○付記:

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



2015-07-23