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

数字

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

解説動画はこちら



まず最初のトリビアは
数字のトリビア.016


一人につき50人の知り合いがいるとして
それを6人まで巡ると地球の人口を超えるというものです。

50を人数の数だけ掛け合わせれば答えが出ます。

コードは
p = 50
for i in range(1,7):
    print('{0: 12}'.format(p ** i))
50
2500
125000
6250000
312500000
15625000000

はい見事に150億となり地球の70億人を越えました。
30人の知り合いでも7億となり日本の人口を越えます。

前に
「水曜日のダウンタウン」で
明石家さんまさんの知り合いそうな人に手紙を送り、
それを繰り返すことで何人たどればさんまさんにたどり着けるかを
検証した際は7人くらいだと思いました。

友達の友達は・・・
を6人繰り返せば
世界中の人と繋がる可能性があるわけです。

これを6次元の隔たりと言うとか言わないとか。
あのGREE社の語源ですね。

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

ちょっとロマンティックな関数が有ります。

それをPythonで再現します。

数学の方の関数を描画するのに
Sympyというのを使います。

from sympy.plotting import plot_parametric
from sympy import Symbol , cos ,sin

def draw_heart():
    t = Symbol('t')
    x = 16 * sin(t) ** 3
    y = 13 * cos(t) -5 * cos(2 * t) -2 * cos(3 * t) - cos(4 * t)
    plot_parametric(x,y,autoscale=True , title='heart' , show=False).show()

draw_heart()

結果は:
heart

なかなか綺麗なハートになりますね。
Sympyは数学的な計算を描画させたりできるので
高校生とかにはちょうどいいかもしれません。


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

平方数
その数値を掛け合わした結果と
その数値の個数,1からの奇数を足した結果が同じになります。

コードは
for i in range(1,21):
    print('{0:02} ** 2'.format(i) , i ** 2)
s = [a for a in range(1,1000,2)]
for i in range(1,21):
    print(i,sum(s[0:i]))

どちらとも同じ結果になります。

1 1  1
2 4  1+3
3 9  1+3+5
4 16 1+3+5+7
5 25 1+3+5+7+9

不思議ですね。
こんな法則があるんです。

はい、次は
数字のトリビア.019

なんとも不思議な計算結果ですね

コードは
for i in range(1,11):
    res = 49 ** i
    print('{0:017}'.format(res) , str(res)[len(str(res))-2:])

結果は:
00000000000000049 49
00000000000002401 01
00000000000117649 49
00000000005764801 01
00000000282475249 49
00000013841287201 01
00000678223072849 49
00033232930569601 01
01628413597910449 49
79792266297612001 01

1から10乗までかけてみました。

確かに奇数乗は末尾が49
偶数乗は末尾が01になりますね。

これを発見した人
相当暇人なんだろうなーと思うトリビアですね。

最後のトリビアは
数字のトリビア.020

単に365回101%かけ続けるだけですが
プログラムなら一瞬です。
1.01 ** 365
37.78343433288728

1日1%成長できるとすると
1年後には約38%成長できることになります。
R天のM谷さんが言っていたとか言わないとか。

ライバルは「昨日の自分」
これを常に心がけたいものです。

今回のトリビアはここまでです。

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

解説動画はこちら




最初のトリビアは
数字のトリビア.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

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

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

このページのトップヘ