defpow_custom(a,b): ret =1while b:if b %2==1: ret *= a a = a*a b //=2return ret
큰 수를 곱하는 것은 Python에서도 느리기 때문에 모듈러 연산자를 중간중간에 쓰자!
최대공약수와 최소공배수
최대공약수(GCD) : 공약수 중 최댓값
최대공약수가 1이면 서로소
최소공배수(LCM) : 공배수 중 최소값
LCM(A, B) = A * B / GCD(A, B)
=> GCD만 잘 구하면 LCM은 O(1)에 구할 수 있다.
최대공약수
# 정방향 체크defgcd(a,b): ret =0for i inrange(min(a, b)):if a % i ==0and b % i ==0: ret = ireturn ret# 역방향 체크 => 더 빠름defgcd(a,b):for i inrange(min(a, b), 0, -1):if a % i ==0and b % i ==0:return i
✅ 😀유클리드 호제법
위의 두 방식보다 훨씬 빠르다
GCD(A, B) = GCD(B, A % B)
# 속도 => O(log N)defgcd(a,b):return b if a % b ==0elsegcd(b, a%b)
소수와 소인수분해
여러가지 소수 판별법
# 2부터 N-1까지 체크defisPrime(N):for i inrange(2, N):if N % i ==0:returnFalsereturnTrue# 2부터 sqrt(N)까지 체크 defisPrime(N): i =2while i*i <= N:if N % i ==0:returnFalsereturnTrue
에라토스테네스의 체
defera(N): ck, p = [Falsefor _ inrange(N+1)], []for i inrange(2, N+1):if ck[i]==True:continue p.append(i)for j inrange(i*i, N+1, i): ck[j]=Truereturn ck, p