νμ΄μ¬ νλ ¬ κ³±μ , κ±°λμ κ³± ꡬνκΈ°
νμ΄μ¬ νλ ¬
μκ³ λ¦¬μ¦ λ¬Έμ λ₯Ό ν λ μκ° λ³΅μ‘λλ₯Ό μ€μ΄κΈ° μν΄ νλ ¬μ κ±°λμ κ³±μ μ¬μ©νλ κ²½μ°κ° μμ΅λλ€. λνμ μΌλ‘ νΌλ³΄λμΉ μμ΄μ κ°μ₯ λΉ λ₯Έ μκ° λ³΅μ‘λκ° O(LogN)μ΄ νλ ¬λ‘ κ΅¬νν μ μμ΅λλ€. νΌλ³΄λμΉμ νλ ¬μ λν λ΄μ©μ μμΈν λ΄μ©μ μλ λ§ν¬λ₯Ό μ°Έμ‘°ν΄μ£ΌμΈμ.
[CS/μκ³ λ¦¬μ¦] - νΌλ³΄λμΉ νμ΄μ¬μΌλ‘ ꡬνλ 3κ°μ§ μκ³ λ¦¬μ¦
μ΄λ κ² κ°λμ© νλ ¬μ κ³±μ μ μ¬μ©νλλ°... μ΄κ² μμ£Ό μ¬μ©νμ§ μλ 3κ°μ μ€μ²©λ forλ¬Έμ μ¬μ©νλ€λ³΄λκΉ κ΅¬νν λ μ λ λ§€μ° μ€νΈλ μ€λ₯Ό λ°μ΅λλ€...;; μ λ§ κ·Έλ° κ² μΌμλ μμ§λ§... 3μ€ μ€μ²© forλ¬Έ λΆν°λ λ―Έμ³λ²λ¦½λλ€ γ γ . κ·Έλμ μ 리νλ μ°¨μμμ νμ΄μ¬μΌλ‘ νλ ¬μ κ³±μ μ μ½κ² μ΄ν΄νκΈ° μν λ°©λ²μ 곡μ νκ³ μ ν©λλ€.
νλ ¬ κ³±μ μ νΉμ±
λκ°μ νλ ¬μ κ³±νμ λ μμ νλ ¬ ν, λ€μ νλ ¬ μ΄μ κΈ°μ€μΌλ‘ μλ‘μ΄ νλ ¬μ΄ λ§λ€μ΄ μ§λλ€.
def matrix_mult(A, B):
temp = [[0] * (len(A)) for _ in range(len(B[0]))]
...
...
return temp
μμ νΉμ±μ λ°λΌ μ½λμμμ κ³±μ μ ν΅ν΄ λ°νλ νλ ¬μ ν¬κΈ°λ μμ νλ ¬μΈ Aμ νκ³Ό λ€μ νλ ¬μΈ Bμ μ΄λ‘ μλ‘μ΄ ν¬κΈ°μ νλ ¬μ λ§λ€μ΄μ€λ€.
νλ ¬μ κ³±μ μ νλμ© λ€ νμ΄λ³΄λ©΄ μμ κ°μ΄ ν μ μλ€. μ΄κ±°λ₯Ό 보면μ μ«μμ ν¨ν΄μ λ§ νμΈνκ³ νλ©΄ κ²°κ΅μλ κ²°κ³Όλ₯Ό μ»μ μ μκΈ°λ νλ°... λμ μ μλ€μ΄ μ΅λλ€. κ·Έλμ μ΄κ±°λ₯Ό i, j, k 3κ°μ μ€μ²© forλ¬Έμ μ¬μ©νλ€κ³ ν λ μλμ κ°μ ν¨ν΄μ λ§λ€ μ μμ΅λλ€.
i, j, k μμλλ‘ μ€μ²©μ΄ λ€μ΄κ°κ³ μν λ°©μμ λ³΄κ³ λΉκ΅ν΄λ³΄λ©΄ μ΄λ»κ² κ³±μ μ΄ μ΄λ£¨μ΄μ§λμ§ νμΈν μ μλ€. κ·Έλ₯ 머리μμΌλ‘ μκ°νλ κ²λ³΄λ€ μ΄λ κ² κ·Έλ¦Όμ κ·Έλ €κ°λ©΄μ μ΄λ»κ² λ‘μ§μ λ§λ€μ΄μΌν μ§ μ§μ λμΌλ‘ 보면 ν¨μ¬ λ μ½κ² λ€κ°κ° μ μλ€.
νμ΄μ¬ νλ ¬ κ³±μ μ½λ
def matrix_mult(A, B):
temp = [[0] * (len(A)) for _ in range(len(B[0]))]
for i in range(len(A)):
for j in range(len(A[0])):
for k in range(len(B[0])):
temp[i][k] += A[i][j] * B[j][k]
return temp
iμ λ²μλ₯Ό Aμ ν, jμ λ²μλ₯Ό Aμ μ΄λ‘ νκ±°λ Bμ ν, kλ Bμ μ΄λ‘ μ§μ νλ€. κ·Έλ¦Όμ λ΄μ©μ κ·Έλλ‘ μ½λλ‘ λ°κΎΈλ ν¨μ¬ μ½κ² μ½λλ₯Ό μμ±ν μ μλ€.
νμ΄μ¬ νλ ¬ κ±°λ μ κ³±
νλ ¬μ κ³±μ λ§ μ΄μ©νλ κ²λ³΄λ€ λλΆλΆ νλ ¬μ κ±°λμ κ³±μ μ΄μ©ν μκ³ λ¦¬μ¦μ μ΄μ©νλ€. κ·Έλμ μ¬μ€ νκ³Ό μ΄μ ν¬κΈ°κ° κ°μ μ μ¬κ° νλ ¬μ λλΆλΆ μ¬μ©ν΄μ i, j, kμ ν¬κΈ°κ° λͺ¨λ κ°κ² νλ κ²½μ°κ° λ§λ€.
νμ΄μ¬ νλ ¬ κ±°λ μ κ³± μ½λ
def matrix_mult(A, B):
temp = [[0] * (len(A)) for _ in range(len(B[0]))]
for i in range(len(A)):
for j in range(len(A[0])):
for k in range(len(B[0])):
temp[i][k] += A[i][j] * B[j][k]
return temp
def matrix_pow(A, n):
if n == 1:
return A
if n % 2 == 0:
temp = matrix_pow(A, n//2)
return matrix_mult(temp, temp)
else:
temp = matrix_pow(A, n-1)
return matrix_mult(temp, A)
νλ ¬μ κ³±μ μ μ΄μ©ν΄μ κ±°λμ κ³±μ ꡬν μ μλ€. μ¬κ·ν¨μλ₯Ό μ΄μ©ν΄μ μ κ³±νλ νλ ¬κΉμ§ λ΄λ €μ€κ²νκ³ μ κ³±μκ° μ§μμΈ κ²½μ° κ°μ νλ ¬μ κ³±ν΄ μ κ³±μν€κ³ νμμΈ κ²½μ°λ A νλ ¬ μμ μ κ³±ν΄μ ν΄κ²°νλ€.