好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

偽物語(下)の数学トリビアをプログラミングで

偽物語(下) (講談社BOX)

偽物語(下) (講談社BOX)

90 ページ上段から引用。

「なんでもいいから、好きな数字を思い浮かべてみな。110でも119でも、なんでもいいから。そんでそれを二回繰り返す」
「ふんふん」
「そうやってできた六桁の数字は、絶対に7で割り切れるんだとさ」

プログラミングネタをしばらく書いてなかった気がしたので、リハビリがてらやってみた。


まずは、絶対に7で割り切れることをざっくりと証明。

問題は要するに 1000 * X + X を 7 で割ると整数になるよ、ってことですね。1000 * X + X をちょっとバラしながら 7 で割ると 142X + (6/7)X + (1/7)X = 143X になるから整数になるよ、と。「(6/7)X + (1/7)X」のところがミソなんですね。計算自体は小学生でもできそうな計算だけど、ちょっと面白いなこれ。

C言語っぽくいうなら、(i % j == j - 1) が真だったら、今回の数学トリビア(?)に当てはまるようだ。というわけで、1000だけでなく100000まで確認してみたのが、以下。

#! /opt/local/bin/ruby
# coding:utf-8

ary = []
1.upto(5) do |i|
  i = 10 ** i
  2.upto(i/2) do |j|
    if i % j == j-1
      puts "#{i}:#{j}"
      ary << [i,j]
    end
  end
end

# 確認                                                                          
ary.each do |a|
  a[0].times do |i|
    m = (i*a[0]+i) % a[1]
    #puts "#{i} * #{a[0]} + #{i} % #{a[1]} = #{m}"                              
    if m != 0
      raise "#{i} #{a}"
    end
  end
end

結果。

1000:7
1000:11
1000:13
1000:77
1000:91
1000:143
10000:73
10000:137
100000:11
100000:9091

というわけで、7だけでなく、11、13、77、91、143でも割り切れるらしいです。へぇー。

たぶん、もっと頭いい方法で解けるんだろうなーと思いつつ。バカを晒しておこう。循環小数っぽいけどよくわからん。数学むずかしいです>< 総あたり万歳!

もっと大きい数でもいけるけど、Ruby の Bignum の範囲に突入するとめっさ時間かかるよ!総あたり万歳!

1000:7
1000:11
1000:13
1000:77
1000:91
1000:143
10000:73
10000:137
100000:11
100000:9091
1000000:101
1000000:9901
10000000:11
10000000:909091
100000000:17
100000000:5882353
1000000000:7
1000000000:11
1000000000:13
1000000000:19
1000000000:77
1000000000:91
1000000000:133
1000000000:143
1000000000:209
1000000000:247
1000000000:1001
1000000000:1463
1000000000:1729
1000000000:2717
1000000000:19019
1000000000:52579
1000000000:368053
1000000000:578369
1000000000:683527
1000000000:999001
1000000000:4048583
1000000000:4784689
1000000000:6993007
1000000000:7518797
1000000000:10989011
1000000000:12987013
1000000000:52631579
1000000000:76923077
1000000000:90909091
1000000000:142857143
10000000000:101
10000000000:3541
10000000000:27961
10000000000:357641
10000000000:2824061
10000000000:99009901

ここまで出したところでマシンが悲鳴を上げだしたから止めたw