Top | INDEX | UP

コンピュータ概論 第08回 Q&A


出席票・アンケート回収数

07回(12/05)
3コマ41
4コマ40
最小公倍数は小学校で習う内容、馬鹿にするな
ごめんなさい

誤植指摘: 共役× 公約○
すいません、指摘どうもありがとう。

1000とか10000の中の素数の数とか分かるようになって何か役に立つようなことがあるのですか?
「役に立つ」の定義にもよりますが、数学の世界では 素数定理 という重要な結果へ連なる話(の最初歩)ではあります。

これは何の役に立つのか?いまだに疑問である。Word や Excel の方が役に立った。
「役に立つ」の定義にもよりますが、「Word や Excel の方が役に立」 つのも事実だと思います。ただ、Word や Excel の内部で何がおこなわれているか まったく知らないのも(将来教員になるであろうみなさんとしては)どうかという気が…。

printf での %f や \n の意味がわからない
\n は「改行」を意味します。たとえば printf を続けて実行した場合を考えてみてください。
print("Hello,\n")
print("World!")
	
print("Hello,")
print("World!")
	
%d (10進整数表記), %f (小数点表現 xxx.xxx), %e (指数表現 x.xxxe+xx)は数値の表記方法の指定です。詳細については マニュアルを眺めてみましょう。
x = 3.1415
prinf("%d, %f, %e\n", x, x, x)
	


なんで include Math とつけるんですか?
ruby では sin や cos や PI は Math.sinMath.cosMath::PI と書くが include Math という「おまじない」をしておくと Math という部分を省略できる(のでわかりやすい、と思います)。

include 〜 的なものは他にもあるんですか?
ありますが、「オブジェクト指向プログラミング」の 話になってしまうのでこの講義では(「おまじない」としてしか)触れられません。 マニュアルのこのあたりが何を言っているのか理解できるように前準備しないといけないので…。

絶対値・整数への丸め、の「丸め」とはなにか?
四捨五入の拡張みたいなものだと考えてもらえばよいと思います。 ある数に対して「一番近い」整数を求める処理です。「一番近い」を どう定義するかによって round, ceil, floor, truncate といった違い が生じますが、用途によって使いわければよいです。

浮動小数点数ってなんですか?
安直に言いますと xxx.xxx という形で表現できる数です。整数との 違いはあくまで(実数の)近似値であって誤差を含むという点にあります。

# 10をx回1/2乗するプログラムで
# x>=7 だと 10 でなくなり
# x>=50 だとすごい数になり
# x>=55 だと 1 になり
# x>=1024 だとエラー
# x はどんな値でも10のはずでは?
x=gets.to_i
n=10**(0.5**x)
puts n**(2**x)
浮動小数点数での計算には誤差が入りこむ余地がある、という事実の 帰結です。たとえば、わたしたちの利用しているノートPCでは 浮動小数点数には せいぜい10進15桁の精度しかありません。
for x in 1..1025 do
  p=0.5**x
  q=2**x
  n=10**p
  m=n**q
  printf("%4d %.16e %.16e %.16e %.16e\n", x, p, q, n, m)
end

nil というのは未チェックという意味か?
そうではなく nil は未定義を意味しています。ただ、 エラトステネスのふるいのプログラム(例)中では、配列を定義したとき に何も代入されていない要素の値は(未定義なので) nil である、という 性質を使って、「未チェック」と解釈しているだけです。
a[i] の値が nil のときに if a[i] と書いても問題ないのか?
false と nil は「偽」と解釈されますので「問題ない」です。

問22を考えてみたけど遅い
def gcd(a,b)
  c=0
  for i in 1..a do
    if a%i==0 and b%i==0 and c<i
      c=i
    end
  end
  return c
end

a=123456789
b=987654321
printf("gcd(%d,%d)=%d\n", a, b, gcd(a,b))
これは正しく動作するプログラムです。「遅い」点については今日の 「ユークリッドの互除法」を参考にしてください。

「エラトステネスのふるい」による素数表示プログラムで
a=[false,false]
for i in 2..100 do
  if a[i]==nil
    a[i]=true         # 
    k=2*i             # この辺が配列aのi番目の要素を素数としたとき
    while k<=n do  # i番目以後の要素で素数でないものを偽
      a[k]=false      # とするプログラムでもよいのか?
      k+=i            #
    end
  end
end
質問の意図を取り違えているかもしれませんが、「i番目以後で素数でないもの」 は計算途中(プログラム実行中)ではまだ確定していないわけですから (ex. i=3 のとき a[7] の値は?)、そういうプログラムは書けないのでは? ある数について「素数でない」かどうかが一目でわかればそもそも 「エラトステネスのふるい」のようなアルゴリズムは不要なわけでして。

sin(60)=-1.25... がしっくりこない
角度の単位が「度」ではなく「ラジアン」 であるのが「しっくりこない」原因だと思いますが、数学的には ラジアンの方が自然な単位なわけでして。もっとも、ようは単位の変換だけの話ですから PI/180 を乗ずれば度数法での三角関数の値が計算できます。
include Math
puts sin(PI/180*60)
puts cos(PI/180*60)
	  
冬季レポートの内容
今日配布します。

パソコン必要?
必要です。

うちインターネットにつながらないんですけど…
大学の環境を利用しましょう。また ruby の実行自体はインターネット接続は不要です。
なおオンラインマニュアルは一括して ダウンロード可能ですから 自分のノートPCに導入しておくと便利かもしれません。