사용자 도구

사이트 도구


ps:teflib:fft

fft.py

  • 고속 푸리에 변환 (Fast Fourier Transform, FFT)에 적혀 있듯이, 처음에는 실제로 fft를 구현하는 코드가 있었지만, 지금은 fft 함수 자체는 존재하지 않는다. 그러나 fft를 사용해서 해결할 수 있는 문제에 동일하게 적용하도록 만들어진 함수들이므로, 모듈 이름을 fft로 유지했다.

multiply

코드

# N multiply
# I {"version": "2.0", "import": ["decimal"], "typing": ["List", "Sequence"]}
def multiply(a: Sequence[int], b: Sequence[int], digit: int = 0) -> List[int]:
    """Returns the multiplication of two polynomials."""
    decimal.setcontext(
        decimal.Context(prec=decimal.MAX_PREC, Emax=decimal.MAX_EMAX))
    if digit == 0:
        digit = min(20, len(str(min(len(a), len(b)) * max(a) * max(b))))
    f = f'0{digit}d'
    a_dec = decimal.Decimal(''.join(format(x, f) for x in a))
    b_dec = decimal.Decimal(''.join(format(x, f) for x in b))
    c_dec = a_dec * b_dec
    total_digit = digit * (len(a) + len(b) - 1)
    c = format(c_dec, f'0{total_digit}f')
    return [int(c[i:i + digit]) for i in range(0, total_digit, digit)]

설명

  • digit가 명시적으로 주어지지 않는 경우, 계수가 2^64보다 작을 것을 가정해서 필요한 digit를 계산한다. 만약 계수가 2^64를 초과할 수 있다면, digit를 명시적으로 주어야 한다.
  • 이 함수를 사용해서 얻은 결과에 반복적으로 이 함수를 다시 적용해야 할 경우, 문자열→int, int→문자열 변환이 불필요하게 반복되는 단점이 있다. 이 부분을 생략할수 있도록 직접 구현하는 편이 더 효율적이다.

이 코드를 사용하는 문제

출처문제 번호Page레벨
BOJ10531Golf Bot플래티넘 2
BOJ1067이동플래티넘 2
BOJ11385씽크스몰다이아몬드 3
BOJ13575보석 가게플래티넘 1
BOJ17104골드바흐 파티션 2다이아몬드 5
BOJ17134르모앙의 추측플래티넘 1
BOJ5051피타고라스의 정리다이아몬드 5

토론

댓글을 입력하세요:
W M H E I
 
ps/teflib/fft.txt · 마지막으로 수정됨: 2021/02/21 05:43 저자 teferi