Share
Embed
Transcript
39 slides
-
Contents 1 ࣗݾհ 2 ॳͱ 3 ϐλΰϥε 4 2 ͭͷฏํͷͰදͤΔૉ
5 ·ͱΊ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 2 / 39 -
ࣗݾհ ͓લ୭Α ໊લ Hayao Suzukiʢླɹॣʣ Twitter @CardinalXaro ϒϩά https://xaro.hatenablog.jp/ ઐ
ֶ (߹ͤɾάϥϑཧ) ֶҐ म࢜ʢֶʣ ɺిؾ௨৴େֶ ࣄ גࣜձࣾΞΠϦοδͰ Python ϓϩάϥϚΛ͍ͯ͠Δ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 3 / 39 -
ࣗݾհ ٕज़ॻͷࠪಡ › ʰEffective Pythonʱ ʢΦϥΠϦʔδϟύϯʣ › ʰNumPy ʹΑΔσʔλੳೖʱ ʢΦϥΠϦʔδϟύϯʣͳͲ
› https://xaro.hatenablog.jp/ ʹҰཡ͋Γ·͢ɻ ͍ΖΜͳൃද › ʮSymPy ʹΑΔࣜॲཧʯ ʢPyCon JP 2018ʣͳͲ › https://xaro.hatenablog.jp/ ʹҰཡ͋Γ·͢ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 4 / 39 -
ॳͱ ͱ ͷੑ࣭ʹؔ͢ΔֶͷҰ ॳͱ తͳख๏ղੳతͳख๏ΛΘͳ͍ ॳ͔ͩΒ؆୯Ͱ͢Ͷʁ Α͔ͬͨʂ ॳͱಛผͳ༧උ͕͍ࣝΒͳ͍͜ͱɻ Hayao (Hiroshima
2019) Number Theory with Python October 12, 2019 5 / 39 -
ࠓͷൃද ͳͥ Python Λ͏ͷ͔ › ൺֱతૉʹϓϩάϥϛϯάͰ͖Δ › ඪ४ϥΠϒϥϦ֎෦ϥΠϒϥϦ๛ʹ͋Δ › Guido
van Rossum ࢯΞϜεςϧμϜେֶͰֶͱܭࢉػՊֶΛ ઐ߈͍ͯͨ͠ ࠓճ͏ͷ › Python 3.7.x › SymPyʢه߸ܭࢉϥΠϒϥϦɺϥΠϒϥϦ๛ʣ › Silvermanʰ͡Ίͯͷ ݪஶୈ 3 ൛ʱ ʢؙળग़൛ʣ ʢωλݩʣ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 6 / 39 -
ࠓͷൃද Python Ͱָ͠Ήॳ › ఆཧͷ݁ՌΛ Python Ͱϓϩάϥϛϯάͯ͠ΈΑ͏ › ఆཧͷূ໌͔Β Python
Ͱϓϩάϥϛϯάͯ͠ΈΑ͏ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 7 / 39 -
Python Ͱָ͠Ήॳ ఆཧͷ݁ՌΛ Python Ͱϓϩάϥϛϯ άͯ͠ΈΑ͏ Hayao (Hiroshima 2019) Number
Theory with Python October 12, 2019 8 / 39 -
ϐλΰϥε ఆٛ (ϐλΰϥε) a2 + b2 = c2 ͕Γཱͭࣗવͷ (a;
b; c) ΛϐλΰϥεͱݺͿɻ ඪ ϐλΰϥεΛॏෳͳ͘ɺΕͳ͘ܭࢉ͍ͨ͠ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 9 / 39 -
ϐλΰϥεΛܭࢉ͠Α͏ɿࠜੑฤ ࠜੑͰܭࢉͩʂ from itertools import product for a, b, c
in product(range(1, 20), repeat=3): if a ** 2 + b ** 2 == c ** 2: print(a, b, c) Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 10 / 39 -
ϐλΰϥεΛܭࢉ͠Α͏ɿࠜੑฤ ࠜੑͰܭࢉͨͧ͠ʂ 3 4 5 4 3 5 5 12
13 6 8 10 8 6 10 8 15 17 9 12 15 12 5 13 12 9 15 15 8 17 ॏෳ͕ͨ͘͞Μ͋Δ͠ɺΕ͕͋Δ͔͠Εͳ͍ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 11 / 39 -
طϐλΰϥε ఆٛ (طϐλΰϥε) ޓ͍ʹૉͰ͋ΔϐλΰϥεΛطϐλΰϥεͱݺͿɻ طϐλΰϥε͚ͩΛੜ͢ΕଞͷϐλΰϥεੜͰ͖Δɻ ϐλΰϥε (3; 4; 5) ͔Βผͷϐλΰϥε
(6; 8; 10) Λ࡞Δ͜ͱ͕Ͱ ͖Δɻ ࣍ͳΔඪ طϐλΰϥεΛॏෳͳ͘ɺΕͳ͘ܭࢉ͍ͨ͠ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 12 / 39 -
طϐλΰϥεΛܭࢉ͠Α͏ ͪΐͬͱͨ͠ from itertools import combinations from math import gcd
for a, b, c in combinations(range(1, 50), 3): if a ** 2 + b ** 2 == c ** 2 and gcd(a, b) == 1: print(a, b, c) ͪΐͬͱͨ͠ › a; b; c ͦΕͧΕҧ͏Ͱ͋Δ › a; b ޓ͍ʹૉͰ͋Δ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 13 / 39 -
طϐλΰϥεΛܭࢉ͠Α͏ طϐλΰϥεͷܭࢉ 3 4 5 5 12 13 7 24
25 8 15 17 9 40 41 12 35 37 20 21 29 ॏෳͳͦ͞͏͕ͩɺΕ͕͋Δ͔͠Εͳ͍...ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 14 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ ໋ طϐλΰϥε (a; b; c) ޓ͍ʹૉͳح s; t(s >
t) Λ༻͍ͯ a = st; b = s2 ` t2 2 ; c = s2 + t2 2 ͱͰ͖Δɻ ͭ·Γ... ޓ͍ʹૉͳحͷϖΞ (s; t) ͕طϐλΰϥε (a; b; c) ʹରԠ͢Δɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 15 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ ิ (͋ͱͰͬ͘͡Γಡ͏) طϐλΰϥε (a; b; c) ͷ a; b
ͷҰํۮͰ͏ҰํحͰ͋Δɻ ·ͨɺc ৗʹحͰ͋Δɻ ূ໌ʢ͋ͱͰͬ͘͡Γಡ͏ʣ. ࣗવͷ (a; b; c) Λطϐλΰϥεͱ͢Δɻ ·ͣɺa; b ͕ڞʹۮͳΒɺϐλΰϥεͷఆ͔ٛΒ c ۮͱͳΓɺ (a; b; c) ڞ௨Ҽ 2 Λ࣋ͭ͜ͱʹͳΓԾఆʹ͢Δɻ࣍ʹɺa; b ͕ڞ ʹحͳΒɺϐλΰϥεͷఆ͔ٛΒ c ۮͱͳΔɻ͜ͷͱ͖ɺ a = 2x + 1; b = 2y + 1; c = 2z ͱ͢Δͱ a2 + b2 = c2 ) 2(x2 + x + y2 + y) + 1 = 2z2 ͱͳΓໃ६ɻ Αͬͯɺa; b ͷɺҰํۮͰ͏ҰํحͰ͋Δɻ·ͨɺϐλΰϥ εͷఆ͔ٛΒ c حͱͳΔɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 16 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ ิ (͋ͱͰͬ͘͡Γಡ͏) طϐλΰϥε (a; b; c) ʹ͓͍ͯɺa Λحɺb Λۮͱ͢Δɻ͜ͷͱ
͖ɺ(c ` b)(c + b) ޓ͍ʹૉͰ͋Δɻ ূ໌ʢ͋ͱͰͬ͘͡Γಡ͏ʣ. ࣗવͷ (a; b; c) Λطϐλΰϥεͱ͠ɺa Λحɺb Λۮͱ͢ ΔɻԾఆ͔Βɺa2 = c2 ` b2 = (c ` b)(c + b) ͱͰ͖Δɻ c ` b; c + b ͷڞ௨ҼΛ d ͱ͢Δͱɺd (c + b) + (c ` b) = 2c; (c + b) ` (c ` b) = 2b ׂΓΔɻԾఆ ͔Β b; c طͳͷͰ d 1 ·ͨ 2 Ͱ͋Δɻ͔͠͠ɺ (c ` b)(c + b) = a2 Ͱ͋Γɺa حͳͷͰ d 1 ʹଞͳΒͳ͍ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 17 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ ิ (͋ͱͰͬ͘͡Γಡ͏) طϐλΰϥε (a; b; c) ʹ͓͍ͯɺa Λحɺb Λۮͱ͢Δɻ͜ͷͱ
͖ɺc ` b; c + b ͦΕͧΕฏํͱͳΔɻ ূ໌ʢ͋ͱͰͬ͘͡Γಡ͏ʣ. ࣗવͷ (a; b; c) Λطϐλΰϥεͱ͠ɺa Λحɺb Λۮͱ͢Δɻ Ծఆ͔Βɺa2 = c2 ` b2 = (c ` b)(c + b) ͱͰ͖Δɻc ` b; c + b ޓ͍ʹૉͰ͋Γɺ͔ͭ (c ` b)(c + b) = a2 ͳͷͰɺ(c ` b)(c + b) ฏํͱͳΔɻΑͬͯɺc ` b; c + b ͕ͦΕͧΕฏํͱͳΔɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 18 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ ໋ طϐλΰϥε (a; b; c) ޓ͍ʹૉͳح s; t(s >
t) Λ༻͍ͯ a = st; b = s2 ` t2 2 ; c = s2 + t2 2 ͱͰ͖Δɻ ূ໌ʢ͋ͱͰͬ͘͡Γಡ͏ʣ. ࣗવͷ (a; b; c) Λطϐλΰϥεͱ͠ɺa Λحɺb Λۮͱ͢Δɻ Ծఆ͔Βɺa2 = c2 ` b2 = (c ` b)(c + b) ͱͰ͖Δɻc ` b; c + b ͦΕͧΕฏํͳͷͰɺc + b = s2; c ` b = t2 ͱͰ͖ΔɻΑͬͯɺ c = s2 + t2 2 ; b = s2 ` t2 2 ͱͳΔɻ·ͨɺ a = q(c ` b)(c + b) = st ͱͳΔɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 19 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ ্खͨ͘͠ from itertools import combinations from math import gcd
for t, s in filter( lambda x: gcd(*x) == 1, combinations(range(1, 10, 2), r=2), ): print( s * t, (s ** 2 - t ** 2) // 2, (s ** 2 + t ** 2) // 2, ) Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 20 / 39 -
طϐλΰϥεΛͬͱ্ख͘ܭࢉ͠Α͏ طϐλΰϥεΛͬͱ্ख͘ܭࢉͨ͠ 3 4 5 5 12 13 7 24
25 9 40 41 15 8 17 21 20 29 35 12 37 45 28 53 63 16 65 ॏෳͳ͘ɺΕͳ͘ܭࢉͰ͖ͨʂ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 21 / 39 -
Python Ͱָ͠Ήॳ ఆཧͷ݁ՌΛ Python Ͱϓϩάϥϛϯάͯ͠ΈΑ͏ › ݁ՌΛͦͷ··࣮ͯ͠۩ମྫΛ؍͢Δ › ҙ֎ͳ๏ଇ͕ݟ͔ͭΔʢ͔ʣ Hayao
(Hiroshima 2019) Number Theory with Python October 12, 2019 22 / 39 -
Python Ͱָ͠Ήॳ ఆཧͷূ໌͔Β Python Ͱϓϩάϥϛ ϯάͯ͠ΈΑ͏ Hayao (Hiroshima 2019) Number
Theory with Python October 12, 2019 23 / 39 -
2 ͭͷฏํͷͰදͤΔૉ ఆٛ (ͷ߹ಉ) a; b ͓Αͼ m ʹ͓͍ͯɺa
` b ͕ m ͷഒͱͳΔͱ͖ɺa; b Λ m Λ๏ͱͯ͠߹ಉͱݺͼɺa ” b (mod m) ͱද͢ɻ ఆཧ (Fermat ͷ 2 ฏํఆཧ) حૉ p ͕ 2 ͭͷฏํͷͰදͤΔ͜ͱͷඞཁे݅ p ” 1 (mod 4) Ͱ͋Δɻ 2 ͭͷฏํͷͰදͤΔʁ p = 97 Λྫʹߟ͑Δɻ › 97 = 92 + 42 ͱͰ͖ΔͷͰɺ97 ” 1 (mod 4) Ͱ͋Δɻ ʢ؆୯ʣ › 97 ” 1 (mod 4) Ͱ͋ΔͷͰɺ97 = 92 + 42 ͱͰ͖Δɻ ʢෆࢥٞʣ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 24 / 39 -
2 ͭͷฏํͷͰදͤΔૉ ূ໌ (p = x2 + y2 ) p
” 1 (mod 4)). حૉ p ͕ 2 ͭͷฏํͷͰදͤΔͳΒɺp = x2 + y2 ͱͳΔɻp حͳͷͰɺx Λۮɺy Λحͱͯ͠Α͍ɻ͜ͷͱ͖ɺ x = 2m; y = 2n + 1 ͱ͢Δͱ p = x2 + y2 = (2m)2 + (2n + 1)2 = 4(m2 + n2 + n) + 1 ΑΓɺp 4 Λ๏ͱͯ͠ 1 ͱ߹ಉͰ͋Δɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 25 / 39 -
ূ໌ͷϥϑεέον େࡶͳํ › ͍͖ͳΓ x2 + y2 = p Λຬͨ͢
(x; y) ΛͯΔͷ͍͠ɻ › x2 + y2 = Mp Λຬͨ͢ (x; y; M) ൺֱత؆୯ʹग़ͤΔͷͰ ग़͢ɻ › M ͷΛͲΜͲΜݮΒͯ͠ 1 ʹ͢Δɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 26 / 39 -
ূ໌ͷεέον ূ໌ (p ” 1 (mod 4) ) p =
x2 + y2) ͷεέον 1 p Λ 4 Λ๏ͱͯ͠ 1 ͱ߹ಉͳૉͱ͢Δɻ 2 A2 + B2 = Mp ͳΔ (A; B; M) Λ୳͢ɻM = 1 ͳΒऴྃɻ 3 (A; B; M) ͔Β a2 + b2 = Mr; r » M ` 1 ͳΔ (a; b; r) Λ ಘΔɻ 4 A2 + B2 = Mp; a2 + b2 = Mr ͔Β u2 + v2 = rp ΛಘΔɻ 5 A u; B v; M r ͱͯ͠ 2 ʹΔɻ ͜ΕΛແݶ߱Լ๏ͱݺͿɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 27 / 39 -
ূ໌ͷεέον ิ ߹ಉํఔࣜ x2 ” `1 (mod p) ղΛ࣋ͭɻ ূ໌ʢఱԼΓʣ.
ฏํ༨ͷ૬ޓ๏ଇ͔Βಋ͚Δɻ ͍͍ײ͡ʹ A2 + B2 = Mp ͳΔ (A; B; M) Λ୳͢ ߹ಉํఔࣜ x2 ” `1 (mod p) ͷղΛ A ͱ͠ɺB = 1 ͱ͢Δͱɺ A2 + B2 p ͷഒͰ͋Δɻ·ͨɺM = A2 + B2 p ͱͳΔɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 28 / 39 -
A2 + B2 = Mp ͳΔ (A; B; M) Λ୳͢
߹ಉํఔࣜ x2 ” `1 (mod p) ͷղΛࢉग़͢ΔʢఱԼΓʣ from random import randint from sympy.ntheory import isprime, legendre_symbol def solve_quadratic(p): if not (isprime(p) and p % 4 == 1): raise ValueError while True: a = randint(1, p - 1) b = pow(a, (p - 1) // 4, p) if legendre_symbol(a, p) == -1 and 1 <= b < p: return b Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 29 / 39 -
A2 + B2 = Mp ͳΔ (A; B; M) Λ୳͢
(A; B; M) Λ୳͢ def sums_of_two_squares(p): """4 Λ๏ͱͯ͠ 1 ͱ߹ಉͳૉΛ 2 ͭͷฏํͷͰද͢""" if not (isprime(p) and p % 4 == 1): raise ValueError A, B = solve_quadratic(p), 1 M = divmod(A ** 2 + B ** 2, p)[0] Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 30 / 39 -
a2 + b2 = Mr Λ୳͢ a2 + b2 =
Mr Λ୳͢ ҎԼͷ݅Λຬͨ͢Α͏ʹ a; b ΛબͿɻ a ” A (mod M) b ” B (mod M) ` 1 2 M » a; b » 1 2 M r ͱ M ͷؔͷൿີ r = a2 + b2 M » “ M 2 ”2 + “M 2 ”2 M = M 2 < M: Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 31 / 39 -
a2 + b2 = Mr Λ୳͢ a2 + b2 =
Mr Λ୳͢ from sympy.ntheory.modular import solve_congruence def sums_of_two_squares(p): """4 Λ๏ͱͯ͠ 1 ͱ߹ಉͳૉΛ 2 ͭͷฏํͷͰද͢""" if not (isprime(p) and p % 4 == 1): raise ValueError A, B = solve_quadratic(p), 1 M = divmod(A ** 2 + B ** 2, p)[0] a = solve_congruence((A, M), symmetric=True)[0] b = solve_congruence((B, M), symmetric=True)[0] r = divmod(a ** 2 + b ** 2, M)[0] Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 32 / 39 -
ূ໌ͷεέον ิ (u2 + v2)(A2 + B2) = (uA +
vB)2 + (vA ` uB)2 ূ໌. ܭࢉ͢Δ͚ͩɻ (uA + vB)2 + (vA ` uB)2 = (u2A2 + 2uAvB + v2B2) + (v2A2 ` 2vAuB + u2B2) = u2A2 + v2B2 + v2A2 + u2B2 = (u2 + v2)(A2 + B2): Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 33 / 39 -
૯্͛ 2 ͭͷํఔࣜ A2 + B2 = Mp a2 +
b2 = Mr 2 ͭͷํఔࣜͷؔ (a2 + b2)(A2 + B2) = M2rp )(aA + bB)2 + (bA ` aB)2 = M2rp ) aA + bB M !2 + bA ` aB M !2 = rp r » M 2 ͳͷͰɺޮΑ͘ܭࢉͰ͖Δɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 34 / 39 -
2 ͭͷฏํͷͰදͤΔૉ 2 ͭͷฏํͷͰදͤΔૉ def sums_of_two_squares(p): A, B = solve_quadratic(p),
1 M = divmod(A ** 2 + B ** 2, p)[0] while True: a = solve_congruence((A, M), symmetric=True)[0] b = solve_congruence((B, M), symmetric=True)[0] r = divmod(u ** 2 + v ** 2, M)[0] s = abs((a * A + b * B) // M) t = abs((b * A - a * B) // M) if r == 1: print(f"${s}^2 + {t}^2={p}$") return else: A, B, M = s, t, r Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 35 / 39 -
2 ͭͷฏํͷͰදͤΔૉ 2 ͭͷฏํͷͰදͤΔૉ from sympy import primerange primes_1_mod_4 =
( p for p in primerange(1, 100) if p % 4 == 1 ) for p in primes_1_mod_4: sums_of_two_squares(p) Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 36 / 39 -
2 ͭͷฏํͷͰදͤΔૉ 2 ͭͷฏํͷͰදͤΔૉ 22 + 12 = 5 32
+ 22 = 13 42 + 12 = 17 52 + 22 = 29 62 + 12 = 37 52 + 42 = 41 72 + 22 = 53 62 + 52 = 61 82 + 32 = 73 82 + 52 = 89 92 + 42 = 97 Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 37 / 39 -
Python Ͱָ͠Ήॳ ఆཧͷূ໌͔Β Python Ͱϓϩάϥϛϯάͯ͠ΈΑ͏ › ߏతͳূ໌ϓϩάϥϛϯάͰ͖Δʢ͜ͱ͋Δʣ › ϓϩάϥϛϯάͰ͖Εূ໌ΛཧղͰ͖Δʢ͔͠Εͳ͍ʣ શମ૾Λݟ͍ͨ...
ϓϩάϥϜશମ https://github.com/HayaoSuzuki/ PyCon-mini-Hiroshima-2019/blob/master/20191012note.ipynb ʹ ͋Γ·͢ɻ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 38 / 39 -
·ͱΊ ͳͥ Python Λ͏ͷ͔ › ൺֱతૉʹϓϩάϥϛϯάͰ͖Δ › ඪ४ϥΠϒϥϦ֎෦ϥΠϒϥϦ๛ʹ͋Δ › ࠔͬͨΒ
SymPy ΛͨΕղܾ͢Δ͜ͱ͕ଟ͍ ఆཧͷ݁ՌΛ Python Ͱϓϩάϥϛϯάͯ͠ΈΑ͏ › ݁ՌΛͦͷ··࣮ͯ͠۩ମྫΛ؍͢Δ › ҙ֎ͳ๏ଇ͕ݟ͔ͭΔʢ͔ʣ ఆཧͷূ໌͔Β Python Ͱϓϩάϥϛϯάͯ͠ΈΑ͏ › ߏతͳূ໌ϓϩάϥϛϯάͰ͖Δʢ͜ͱ͋Δʣ › ϓϩάϥϛϯάͰ͖Εূ໌ΛཧղͰ͖Δʢ͔͠Εͳ͍ʣ Hayao (Hiroshima 2019) Number Theory with Python October 12, 2019 39 / 39