乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

数学

またまた数字のトリビアの検証です

解説動画はこちら




最初のトリビアは
数字のトリビア.007




初めのトリビアは
数字のトリビア.011

きれいに1が並ぶピラミッドのような
かけ算の方法です。

桁が増えるごとに
1
12
123

と数を増やして行き
そこに9をかけて元の数より1大きい数を足します。

すると綺麗に1が並ぶピラミッドが形成されます。

コードは
for i in range(1,10):
    tmp = ''
    for j in range(1,i+1):
        tmp+=str(j)
    print('{0: 11} * 9 + {1:02}'.format(int(tmp),i+1), int(tmp)*9 +i+1)

結果は:

1 * 9 + 02 11
12 * 9 + 03 111
123 * 9 + 04 1111
1234 * 9 + 05 11111
12345 * 9 + 06 111111
123456 * 9 + 07 1111111
1234567 * 9 + 08 11111111
12345678 * 9 + 09 111111111
123456789 * 9 + 10 1111111111

となります。

お次は
数字のトリビア.012

これも似たようなかけ算です。

かける数字は1を桁分用意して、それを二乗するような形になります。

コードは
for i in range(1,10):
    a = int('1' *i)
    print('{0: 10} * {0: 10} = '.format(a) , a*a)


結果は:
1 * 1 = 1
11 * 11 = 121
111 * 111 = 12321
1111 * 1111 = 1234321
11111 * 11111 = 123454321
111111 * 111111 = 12345654321
1111111 * 1111111 = 1234567654321
11111111 * 11111111 = 123456787654321
111111111 * 111111111 = 12345678987654321

先ほどとは真逆で、1の連続を掛け合わせると
どんどん数字が重なって行きます。

次のトリビアは
数字のトリビア.013

宴会や合コンで使えるテクニックです。

まずは365日分の文字を用意します。
nums = []
for m in range(1,13):
    for d in range(1,32):
        if m==2 and d>28:
            continue
        elif m in (4,6,9,11) and d==31:
            continue
        nums.append('{0:02}{1:02}'.format(m,d))
次に
その文字を使って1年分の検証をします。

上記操作をすると
最後に相手に答えてもらった数字から225を引くと
相手の誕生日になるということです。

for day in nums:
    m = int(day[0:2])
    d = int(day[2:4])
    m2 = m * 4
    m3 = m2 + 9
    m4 = m3 * 25
    m5 = m4 + d
    answer = m5 -225
    print(day , answer)
結果は全部同じ日になります。

これでうまいこと
誕生日を知ることができるわけです。

まあ最初は
郵便番号とかしか
聞いてはダメでしょうねwww


次は

数字のトリビア.014

人と人との出会いが
いかに奇跡的なことかというお話です。
res=1
for num ,name in zip([1,60,60,24,365,50],['秒','分','時間','日','年','50年']):
    res*=num
    print('{0}は{1}秒'.format(name , res))
秒は1秒
分は60秒
時間は3600秒
日は86400秒
年は31536000秒
50年は1576800000秒

1秒に1人出会えても
50年で15億人しか出会うことはでき無いのです。

地球の全人類と出会うには
250年は掛かりそうです。

なので人生にの出会いというものは
奇跡なのだよという、ちょっと哲学的なお話です。


さて最後のトリビアは
数字のトリビア.015


組み換えが気持ちいーー
6桁の数字が有ります

それは

142857

これに
1から数字をかけて行くと・・・

for i in range(1,8):
    print('142857 * {0}'.format(i) , 142857 * i)

142857 * 1 142857
142857 * 2 285714
142857 * 3 428571
142857 * 4 571428
142857 * 5 714285
142857 * 6 857142
142857 * 7 999999

はい、結果は同じ数字が入れ替わります。
7までかけたら終了ですね。

いやー気持ちいい




はい
またまた 数字のトリビアをPythonで検証してみました。

解説動画はこちら




最初のトリビアは
数字のトリビア.007

割るときれいな数字がでる組み合わせです。

コードは
print(1/81)
print(1/891)
print(1/8991)
print(1/89991)
print(1/8181)
print(1/818181)

0.012345679012345678
0.001122334455667789
0.00011122233344455567
1.1112222333344445e-05
0.0001222344456667889
1.2222234444456666e-06

以外ときれいに並びますねー
Pythonのデフォルトでは桁数がそんなに多く出せ無いので
こんな感じになってしまいます。


次は
数字のトリビア.008

またまた割り算のトリビアですが
これはデフォルトでは桁が足り無いので
正確な小数点の計算をするためのライブラリを用います。

decimal

コードは
import decimal

decimal.getcontext().prec = 1000
a = decimal.Decimal(10000)
b = decimal.Decimal(9801)
print(a / b)
結果は・・・
1.02030405060708091011121314151617181920
2122232425262728293031323334353637383940
4142434445464748495051525354555657585960
6162636465666768697071727374757677787980
818283848586878889909192939495969799000
・・・
1から一つづつ数字が増えていく結果になります。

おしい
97までは並んだのに

というかこれを発見した人
絶対ヒマ人でしょ

こんな計算
いつやるの?


・・
・・・

ひまでしょ!!

はい。

お次は
数字のトリビア.009

なんか良くわかりませんが上記の操作をすると
必ず同じ数字に戻るんだそうです。
なんか不思議ですね
for i in range(100,1000):
    a2 = int(str(i)*2)
    a3 = a2//7
    a4 = a3//11
    a5 = a4//13
    print(i,a5)



トリは
数字のトリビア.010

ゾロ目以外の4桁の数字で
数字を大きい順に並び替えたものから
数字を小さい順に並び替えたものを引く。

それをまた同じ操作をしていくと・・・

6174になるんだそう。

検証したコードはこちらに。

まずは上記の操作をする関数kapを作ります。
6174になるまで再帰します。

def kap(i):
    ma = sorted([a for a in str(i)],reverse=True)
    mi  = sorted([a for a in str(i)])
    m  = int(''.join(ma)) - int(''.join(mi))
    if m ==6174:
        return m
    else:
        return kap(m)
for i in range(1000,10000):
    if str(i)[0]==str(i)[1]==str(i)[2]==str(i)[3]:
        continue
    else:
        try:
            m = kap(i)
            print(i,m)
        except:
            print(i,'X')

あとはゾロ目は除いて
4桁の数字を検証。

だいたいは
6174になるようですね。
一部は再帰が終わらずエラーになってしまいました。


このように
最大に並べ替えたものから最小に並べ替えたものを引いた答えが
元と同じになるような数をカプレカ数と言うのだそうで。

なかなか面白い数字ですね。

また次回もお楽しみに!!

数字にまつわるトリビアを
Pythonで検証してみました。


解説動画はこちら




まず始めのトリビアは

数字のトリビア.002

はい、1回折れれば厚さが二倍になるということで
検証したコードがこちら
moon = 0.08 * (2 ** 43)
print('{}万キロ'.format(moon/10/100/1000/10000))
70.368744177664万キロ

飛んでもないですね
43乗すれば月まで届きそうですね

折れればですが

花山薫のピンチ力をもってしても
無理そうな問題です

お次が
数字のトリビア.003
コードは
for i in range(1,10):
    print('3912657840 / {0} '.format(i) , 3912657840%i)

3912657840 / 1 0
3912657840 / 2 0
3912657840 / 3 0
3912657840 / 4 0
3912657840 / 5 0
3912657840 / 6 0
3912657840 / 7 0
3912657840 / 8 0
3912657840 / 9 0

余りがないということは割り切れている
ということで、きれいに割り切れました。

お次は
数字のトリビア.004

これまた割り切り問題ですね

コードは
まずこの9つの数字を使った順列を求めます。
import itertools
seq = ['1','2','3','4','5','6','7','8','9']
per = list(itertools.permutations(seq))
print(len(per))
362880

この順列と同じだけ検証して
合っていれば+1カウントします。

結果は・・
count = 0
for tmp in itertools.permutations(seq):
    num = int(''.join(tmp))
    if num % 3 == 0:
        count+=1
print(count)
362880

全部割り切れました。1-9全部使った9桁の数値は
みな3で割り切れます。

ちなみにこの数は絶対9の倍数になるので
必ず3では割り切れるようになっています。

次は
数字のトリビア.005


コードは
for i in range(1,10):
    print('12345679 * 9 * {0}'.format(i) , 12345679 * 9 * i)

12345679 * 9 * 1 111111111
12345679 * 9 * 2 222222222
12345679 * 9 * 3 333333333
12345679 * 9 * 4 444444444
12345679 * 9 * 5 555555555
12345679 * 9 * 6 666666666
12345679 * 9 * 7 777777777
12345679 * 9 * 8 888888888
12345679 * 9 * 9 999999999

結果は綺麗にそろいます。
元の数字は8だけ抜けてますけどね。

さて最後は
数字のトリビア.006


語呂合わせで
18782 + 18782

この結果は・・・・

37564

ということでした。
良く知られた数字の計算ですね。

また次回も数字のトリビアをお送りします。

このページのトップヘ