intro
ποΈ μμ νμ λ²μΌλ‘ μ λͺ ν μλΌν μ€ν λ€μ€μ 체(Sieve of Eratosthenes)λ₯Ό κ°μ ν 'μ€μΌλ¬μ 체(Euler Sieve)'μ λν΄μ μκ°νλ€. μλΌν μ€ν λ€μ€μ 체λ μμ νλ³ μκ° λ³΅μ‘λκ° O(nloglogn)μμ΄ μλ €μ Έ μκ³ , μ΄λ₯Ό κ°μ ν μ€μΌλ¬μ 체 μκ° λ³΅μ‘λλ λ¨ μ ν μκ°λ§μ O(n)μΌλ‘ νλ³μ΄ κ°λ₯νλ€.
ποΈ μλΌν μ€ν λ€μ€μ 체μ μκ° λ³΅μ‘λκ° μ ν μκ°(O(n))μ΄ λ μ μλ μ΄μ λ ν©μ±μ 210μ λ€λ©΄ μ½κ² μ μ μλ€. 210μ 2x3x5x7λ‘ λνλΌ μ μλλ°, μλΌν μ€ν λ€μ€μ 체μ μν΄μλ 2x3x5x7 / 2x3x5x7 / 2x3x5x7 / 2x3x5x7 μ κ°μ΄ κ°κ° λΉ¨κ°μ μ«μμΌ λ 210μ΄ ν©μ±μμμ μ€λ³΅ν΄μ μλ €μ£Όκ³ μλ€.
ποΈ λ°λΌμ, μ΄λ₯Ό λ¨ νλ²μ ν©μ±μκ° μλμ μλ €μ£ΌκΈ° μν΄ κ°μ ν μκ³ λ¦¬μ¦μ΄ Euler Sieve μκ³ λ¦¬μ¦μ΄κ³ , μκ° λ³΅μ‘λλ O(n). λ°λΌμ μλΌν μ€ν λ€μ€μ 체 λ³ν ν 'Linear Sieve'λΌ λΆλ₯΄κΈ°λ νλ€. μ€μΌλ¬μ 체λ₯Ό μ€ννλ©΄ Nμ΄νμ μμ β κ°κ° μμ°μμ μ΅μ μμΈμ list(spf(smallest prime factor) list)μ β‘ μμ listλ₯Ό λ κ°λ μ»μ μ μλ€. λν, spf listλ₯Ό μ¬μ©ν΄ β’ λΉ λ₯Έ μμΈμλΆν΄λ κ°λ₯νλ€.
1. making an Euler Sieve
ex) N = 29 κ°μ
β μ΄κΈ°ν) 30κ°μ μ«μκ° λ€μ΄κ° μ μλ listλ₯Ό λ§λ λ€(index 0λΆν° μμνλ―λ‘ 30κ° μ€λΉ)
(1) μ΄ 30κ°μ μΉΈμ 0λΆν° 29κΉμ§μ μ«μλ₯Ό μ°¨λ‘λλ‘ (index κ·Έλλ‘) μ§μ΄ λ£λλ€.
(2) 2 ν¬ν¨ 29κΉμ§μ λͺ¨λ μ§μλ 2λ‘ λ°κΎΌλ€. (λͺ¨λ μ§μλ 무쑰건 μμΈμλ 2μ΄λ―λ‘ μ΄κΈ°ν λ 미리 μ€μ ν΄λμ)
β μ§μλ μ 체 λ²μμ μ λ°μ΄λ ν΄λΉνλ―λ‘ λ―Έλ¦¬ 2λ‘ λ°κΎΈλ©΄ νμ μκ° μ€μΌ μ μμ
(3) prime listμ 2λΆν° λ£κ³ μ€λΉ.
β‘ xλ₯Ό 3λΆν° floor(√N)κΉμ§ νμλ§ λλ¦°λ€. (λ리λ λ³μ x κ°μ ) (μλ κ·Έλ¦Ό μ΄λ‘μ μ«μ)
(λ°°μλ§νΌ O(N) μκ° λ³΅μ‘λλ‘ searchingνκΈ° λλ¬Έμ μ 체 NκΉμ§ λ릴 νμ x / λν μ§μλ spf 무쑰건 2μ΄λ―λ‘ μλ΅. νμλ§ λλ¦Ό)
ex) μ¦ xλ₯Ό 3νκ³ 5λ§ λλ¦°λ€.
β’ sieve[x]κ° index λ μμ xλΌλ©΄ (if sieve[x] == x), xλ xλ³΄λ€ μμ μμ λ°°μμμ κ±Έλ¬μ§μ§ μμλ€λ μλ―Έ, μ¦ xμ μ½μλ 1κ³Ό λ μμ λ§ μμμ΄ μ¦λͺ λμκΈ°μ μμμμ΄ μ¦λͺ λ¨. λ°λΌμ prime listμ λ£λλ€
β£ κ·Έλ¦¬κ³ yλΌλ λ³μλ₯Ό x*xλΆν° sieve λκΉμ§ x*2 stepμΌλ‘ λλ©΄μ xμ λ°°μ(x μμ μ μΈ)μΈ yλ λͺ¨λ ν©μ±μ(μμμ λ°°μλ λͺ¨λ ν©μ±μ)μ΄λ―λ‘ μμκ° μλλ€. μ΄ λ sieve[y]κ° μ΄λ―Έ ν©μ±μμμ΄ λ°νμ‘λ€λ©΄(sieve[y] != y) ν΄λΉ yλ xκ° μ΅μ μμΈμκ° μλλ―λ‘ pass. sieve[y]κ° yλ‘ μ΄κΈ°νλ μνλ‘ κ·Έλλ‘ μλ€λ©΄ ν΄λΉ yλ xκ° μ΅μ μμΈμμ΄λ―λ‘ sieve[y] = x λ§νΉ.
β x*2κ° μλλΌ x*xλΆν° λλ μ΄μ λ, x*x μ΄νμ xμ λ°°μλ spfλ₯Ό xλ‘ μμΈμλ₯Ό κ°μ§μ§ μκΈ° λλ¬Έ.
β stepμ xκ° μλλΌ x*2λ‘ μ€μ ν μ΄μ λ, xλ₯Ό μ§μλ°°ν μ«μλ 무쑰건 μ§μκ° μμΈμλ‘ λ€μ΄κ°λ―λ‘ 2κ° spfμ΄κΈ° λλ¬Έ.
ex) xκ° 3μΌ λ, 3μ μ κ³±λΆν° λκΉμ§ 6μ© step λλ©΄μ 15, 21, 27μ 3 λ§νΉ
ex) xκ° 5μΌλ, 5μ μ κ³±λΆν° λκΉμ§ 10μ© step λλ©΄μ 25μ 5 λ§νΉ
β€ NκΉμ§μ spf list μμ±(μ μ€λ₯Έμͺ½ κ·Έλ¦Ό). spf listλ§ μνλ€λ©΄ xμ λ²μλ₯Ό √NμΌλ‘ νμν΄λ μΆ©λΆνλ, prime listκΉμ§ μνλ€λ©΄ NκΉμ§ νμν΄ sieve[x] == xμΈ κ²½μ° μ°¨λ‘λλ‘ prime listμ λ£μ΄μ£Όλ©΄ λλ€. κ·Έλ΄ κ²½μ° prime listλ [3, 5, 7, 11, 13, 17, 19, 23, 29] μμ±
2. Factorization
β μμμ λ§λ spf listλ₯Ό νμ©ν΄ λΉ λ₯Έ μμΈμλΆν΄λ₯Ό μ§νν μ μλ€. μλ₯Ό λ€μ΄ numμ΄λΌλ λ³μμ μμΈμλΆν΄λ₯Ό μ§ννλ€λ©΄ numμ spf κ°μ 체ν¬. λ μμ μ΄λΌλ©΄ numμ΄ μμμ΄λ―λ‘ num ν κ° μΆλ ₯νλ©΄ λ. κ·Έλ μ§ μλ€λ©΄ num//spf κ°μ spf κ°μ ꡬν΄λκ°λ©΄ λλ€. λ°λΌμ numμ΄ 1μ΄ λ λκΉμ§ numμ spfλ₯Ό λλμ΄λκ°λ©° factorizationμ μμ±ν΄λκ°λ©΄ λλ€.
ex) numμ΄ 210μ΄λΌλ©΄ spf[num](=spf[210])μ΄ 2μ΄λ―λ‘ 2 μ μ₯ν λ€, 210μ 2λ‘ λλ 105λ₯Ό numμΌλ‘ μ€μ spf[num](spf[105])μ 보λ 3μ΄λ―λ‘ 3 μ μ₯ν λ€, 3μΌλ‘ λλ 35λ₯Ό numμΌλ‘ μ€μ . spf[35]λ 5μ΄λ―λ‘ 5 μ μ₯νκ³ 7μ numμΌλ‘ μ€μ . spf[7]μ 7μ΄λ―λ‘ 7 μ μ₯νκ³ 1μ numμΌλ‘ μ€μ . numμ΄ 1μ΄ λμμΌλ―λ‘ μ’ λ£.
ex) num = 27μΌ λ μμΈμλ₯Ό μ°Ύλ κ³Όμ μ κ·Έλ¦ΌμΌλ‘ λνλ΄λ©΄ μλμ κ°λ€.
: λ Έλμ λ°μ€κ° 27μ μμΈμλ‘ 3, 3, 3μμ λ°λ‘ μ μ μλ€.
code
β linear sieve μμ± μ½λ(nκΉμ§μ spf list)
#linear sieve
sieve = [i for i in range(n+1)]
sieve[4::2] = [2]*(math.ceil((len(sieve)-4)/2))
for x in range(3,(int(len(sieve)**(1/2)))+1,2):
if sieve[x] == x:
for y in range(x*x,len(sieve),x*2):
if sieve[y] == y:
sieve[y] = x
β‘ factorization μ½λ(num μμΈμλΆν΄)
ans=[]
while num > 1:
ans.append(spf[num])
num//=spf[num]
print(*ans)
examples
β <λ°±μ€ G4 16563 μ΄λ €μ΄ μμΈμλΆν΄> β λ¬Έμ λ§ν¬
Q. λ§ κ·Έλλ‘ μ λ ₯ν μλ€μ μμΈμλΆν΄λ₯Ό μ§νν΄ λͺ¨λ μμΈμλ€μ κ°κ° μΆλ ₯ν΄μ£Όλ λ¬Έμ . Nμ λ²μκ° 5λ°±λ§κΉμ§μ΄λ―λ‘ euler sieve νμ©
β <λ°±μ€ G2 3142 μ¦κ±°μ΄ μΆμ μν λ Έλ ₯> β λ¬Έμ λ§ν¬
Q. μμ μ κ³±μ μ¬λΆλ₯Ό μμΈμ μ’ λ₯λ³ μ§μ κ°μμΈμ§ νλ¨νλ λ¬Έμ . μμΈμ μ’ λ₯κ° λ€μ΄κ° set() μλ£ν λ§λ€κ³ μ λ ₯ν μ«μμ μμΈμκ° setμ μλ€λ©΄ μ½μ . μλ€λ©΄ set()μ μ‘΄μ¬νλ μμΈμ μμ λ λ°©μμΌλ‘ μ§νν΄ setμ λ¨λ μμΈμ μ¬λΆμ λ°λΌ μμ μ κ³±μ νλ³νλ λ¬Έμ
'Computer Science > Algorithms' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π£οΈ Shortest Path in an Unweighted Graph (0) | 2024.05.23 |
---|---|
β Flood Fill (0) | 2024.05.19 |
π₯Counting Sort (0) | 2024.04.17 |
πΌTower of Hanoi (0) | 2024.04.09 |
βMerge Sort (0) | 2024.04.06 |
λκΈ