본문 바로가기
Sejong University/Number theory

Factoring

by reindeer002 2022. 4. 23.
728x90
import math as m

#num을 인수분해 한 후 그 수들의 리스트를 반환(simple division)
def factoring_simple(num):
    n = 2 #처음 소수인 2부터 시작
    factors = [] #num의 소인수들
    while num != 1: #num이 1이 될 때까지 반복
        if num % n == 0: #만약 n이 num의 소인수라면
            factors.append(n) #리스트에 저장
            num /= n #num을 n으로 나눈 몫으로 변경
        else: #n이 소인수가 아니라면
            n += 1 #다음 소수로 연산을 하기 위한 증가 연산
    return factors #소인수 리스트 반환

#num = q*p를 만족하는 q, p의 값을 반환
def factoring_fermat(num):
    factors = [] #num의 2가지 소인수
    a = m.ceil(m.sqrt(num)) #num의 제곱근보다 작거나 같은 정수로 초기화
    b = a*a - num #c^2 = a^2 - num의 형태로 만들기 위한 b를 설정
    while b != m.ceil(m.sqrt(b))*m.ceil(m.sqrt(b)): #b가 제곱수가 아니라면
        a = a + 1 #다음 숫자 검사
        b = a*a - num #바뀐 a를 사용하여 b를 다시 설정
    factors = [int(a - m.sqrt(b)), int(a + m.sqrt(b))] #factors리스트를 초기화
    return factors #소인수 리스트 반환

#메인 함수
def main():
    print('factoring_simple(11):', factoring_simple(11))
    print('factoring_simple(100):', factoring_simple(100))
    print('factoring_simple(12345):', factoring_simple(12345))
    print('factoring_simple(1000001):', factoring_simple(1000001))
    print('factoring_simple(2**16):', factoring_simple(2**16))
    print('factoring_fermat(15):', factoring_fermat(15))
    print('factoring_fermat(119):', factoring_fermat(119))
    print('factoring_fermat(187):', factoring_fermat(187))
    print('factoring_fermat(2987):', factoring_fermat(2987))
    print('factoring_fermat(6750311):', factoring_fermat(6750311))

main()
728x90

'Sejong University > Number theory' 카테고리의 다른 글

Knapsack Cipher  (0) 2022.04.23
Mersenne Prime  (0) 2022.04.23
Modular Exponentiation  (0) 2022.04.23
GCD and Extended GCD  (0) 2022.04.23
Prime Number  (0) 2022.04.23

댓글