Special Lesson 3 - 約数,倍数の扱い

 「BがAの約数である」ことは,Mod演算子を用いてもよいですが,他にも以下のように表されます。

A=Int(A/B)*B

 なぜなら,AがBで割り切れるなら A/B=Int(A/B) であり,これにBをかけたものがAに一致する一方,AがBで割り切れないとき A/B≠Int(A/B) であり,これにBをかけたものはAに一致しないからです。

 下のプログラムは,約数の判定をします。

#prompt
Dim A As Double, B As Double
Input A
Input B
If A=Int(A/B)*B Then
    Print B;"は";A;"の約数です。"
ElseIf B=Int(B/A)*A Then
    Print A;"は";B;"の約数です。"
Else
    Print B;"は";A;"の約数でありません。"
    Print A;"は";B;"の約数でありません。"
End If

<実行例>

? 14
? 7
7 は 14 の約数です。
? 5
? 35
5 は 35 の約数です。
? 20
? 8
8 は 20 の約数でありません。
20 は 8 の約数でありません。

問19
 数列 {an} は,次の形で定義されている。

an = (n2 + 2 が持つ約数の数) (n = 1, 2, 3, ...)

 例えば,以下のような値になる。

n = 112 + 2 = 33 の約数は 1, 3a1 = 2
n = 222 + 2 = 66 の約数は 1, 2, 3, 6a2 = 4
n = 332 + 2 = 1111 の約数は 1, 11a3 = 2
n = 442 + 2 = 1818 の約数は 1, 2, 3, 6, 9, 18a4 = 6

 この数列の,初項から第20項までを表示するプログラムを作成せよ。(ヒント:最初に n2 + 2 を計算し,1 からその数までの間に約数となるものがいくつあるかを調べる。)


 次に,有名な「ユークリッドの互除法」という最大公約数の求め方を述べます。
 2つの整数の最大公約数を求めますが,この2数を a, b とします。
 もしこの時 a が b の倍数であるかあるいはその逆であれば,その小さい方が最大公約数と確定します(当たり前)が,そうでなければ a > b とし(違えば入れ替えればよい),a, b の公約数が c であると仮定します。この場合,a = a1c, b = b1c とおくことができるので,辺々引くと

a - b = c(a1 - b1)

 すなわち,a - b もまた c を約数に持ちます。
 この時 min{a, b} と a - b の間で同様の判定をします。(min{a, b} は a と b の小さい方を示す)そうしてもし一方が他方の倍数であれば,その小さい方がこの2数の最大公約数というだけではなく,最初の a と b との最大公約数でもあるのです。


 この繰り返しで,一方が他方の倍数になった場合に,その小さい方を最初の a と b との最大公約数であるという形で最大公約数が得られます。

実際には,数を1回ずつ引かず(a - b のように),a - b < b となるまで引く(すなわち,余りを取る)ことで計算速度を上げています。

#prompt
Dim A As Double, B As Double
Dim C As Double ' 2値を交換するため。
Dim R As Double

Print "最大公約数を求める"
Input A
Input B
If A<B Then ' A>=B にしておきたいので,もし逆なら交換する。
    ' 2値を交換する際の定石。1つ余分に変数が必要なことに注意。
    C=A
    A=B
    B=C
End If

While A<>Int(A/B)*B ' もしAがBの倍数ならばループを抜ける(そうでないときループに入る)。
    R=A Mod B ' 余りを計算(A - B の代わり)。

    ' 次は B と R で判定する。このために B → A ,R → B と置き換える。
    A=B
    B=R
Wend

Print "最大公約数は:";B

問20
上のプログラムを書き換えて,A と B の最小公倍数を求めるプログラムを作成せよ。(ヒント:A と B の最小公倍数を P,最大公約数を Q とすると,P = A×B÷Q)

戻る