[Draft] PEP 791 - intmath — module for integer-specific mathematics functions
원문 링크: PEP 791 - intmath — module for integer-specific mathematics functions
상태: Draft 유형: Standards Track 작성일: 12-May-2025
PEP 791: intmath
— 정수 전용 수학 함수 모듈
개요 (Abstract)
이 PEP는 math.gcd()
또는 math.isqrt()
와 같이 정수 인수를 위해 정의된 수론, 조합론 및 기타 함수를 위한 새로운 모듈을 제안합니다.
도입 배경 (Motivation)
현재 math
모듈은 C 표준에서 정의된 수학 함수를 제공하는 것을 목표로 하지만, 시간이 지남에 따라 C 표준이나 부동 소수점 연산과 관련 없는 함수들이 추가되었습니다. 이로 인해 math
모듈의 범위, 내용 및 인터페이스(반환 값 또는 허용되는 인수)를 설명하기가 훨씬 어려워졌습니다.
예를 들어, math
모듈 문서의 “명시적으로 다르게 언급되지 않는 한, 모든 반환 값은 float입니다”라는 문구는 더 이상 사실이 아닙니다. 문서의 “수론적 함수(Number-theoretic functions)” 섹션에 나열된 함수 중 어떤 것도 float를 반환하지 않지만, 문서에는 명시되어 있지 않습니다.
새로운 intmath
모듈을 도입하면 “모든 반환 값은 정수입니다”라는 문장을 정확하게 사용할 수 있어 문서의 명확성을 높일 수 있습니다. 또한 math
모듈과 새 모듈 모두에서 함수가 허용하는 인수에 대한 설명을 단순화할 수 있습니다.
현재 math.factorial(100)
이 정확한 값을 반환할지, 아니면 근사치를 반환할지에 대한 사용자들의 기대치를 충족시키기 어렵습니다. 많은 언어, Python 패키지(예: scipy), 계산기들은 비슷한 이름의 함수가 부동 소수점 값을 반환하며, 이는 근사치일 뿐입니다.
cmath
및 statistics
모듈이 존재하듯이, math
모듈은 모든 수학 함수를 위한 포괄적인 장소로 사용될 수 없습니다. 정수 관련 함수도 마찬가지로 별도의 모듈이 필요합니다. 이는 공유된 컨텍스트를 제공하여 문서의 장황함을 줄이고 개념적 부담을 덜어줍니다. 또한, 관련 함수들을 그룹화하여 발견 가능성(discoverability)을 돕고 IDE의 자동 완성 기능을 더욱 유용하게 만듭니다.
현재 CPython의 math
모듈 코드는 약 4200 라인(LOC)이며, 이 중 새 모듈에 해당하는 코드는 약 1/3 (1300 LOC)입니다. 이는 cmath
(1340 LOC)와 비슷한 수준입니다.
이러한 상황은 더욱 악화되는 경향이 있습니다. 모듈 분할이 처음 제안되었을 때 factorial()
(다른 모듈 함수처럼 float도 허용)과 gcd()
(fractions 모듈에서 이동) 두 가지 정수 관련 함수만 있었습니다. 그 후 isqrt()
, comb()
, perm()
이 추가되었고, math
네임스페이스를 어지럽히지 않고 모든 새 함수를 직접 새 모듈로 보내기 위해 새 모듈 추가가 두 번째로 제안되었습니다. 현재는 6개의 함수가 있으며 factorial()
은 더 이상 float를 허용하지 않습니다.
초기 논의 스레드와 이슈 python/cpython#81313
에서 제안된 몇 가지 추가 함수들은 다음과 같습니다.
c_div()
및n_div()
: 양의 무한대(ceiling divide)로 반올림하거나 가장 가까운 정수로 반올림하는 정수 나눗셈.gcdext()
: 두 변수의 선형 디오판토스 방정식 해결 (int 구현에는 확장 유클리드 알고리즘이 포함).isqrt_rem()
: 정수 제곱근과 나머지를 함께 반환 (정수가 완전 제곱수가 아닌 경우에만 0이 아님).ilog()
: 정수 로그.math.log()
는 정수 인수에 대한 특별한 처리를 가지고 있지만, 아직 문서화되지 않았습니다.fibonacci()
: 피보나치 수열.
근거 (Rationale)
math
모듈 문서를 대신 수정하면 어떨까요? 물론, 모듈 서문을 더 모호하게 만들 수 있습니다(“math
모듈에는 일부 수학 함수가 포함되어 있습니다” 정도로). 각 함수의 입력/출력과 동작(예: factorial()
출력이 scipy.special.factorial
처럼 기본적으로 정확한지 여부)을 정확하게 설명할 수도 있습니다.
하지만 가장 큰 문제는 현재 모듈이 서로 다른, 거의 겹치지 않는 응용 도메인을 혼합하고 있다는 점입니다. 더 많은 문서를 추가하는 것은 이 문제를 더욱 부각시키고 최종 사용자에게 더 나쁜 경험을 제공할 뿐입니다(읽거나 건너뛸 텍스트가 더 많아짐). 또한 발견 가능성 문제(함수를 어느 모듈에서 찾을 수 있는지, 그리고 함수가 존재하는지 여부를 알기 위해 모듈의 모든 함수를 살펴봐야 하는 문제)나 탭 자동 완성 문제를 해결하지 못할 것입니다.
명세 (Specification)
PEP는 다음 정수 관련 함수들을 intmath
라는 새 모듈로 옮길 것을 제안합니다. (이름에 대한 대안은 “Open Issues” 참조)
comb()
factorial()
gcd()
isqrt()
lcm()
perm()
math
모듈의 기존 별칭(alias)들은 약하게 폐기(soft deprecated)될 것입니다. 이 PEP는 하위 호환성을 깨는 변경 사항을 도입하지 않습니다.
모듈 함수는 정수 및 __index__()
메서드를 구현하는 객체를 허용하며, 이 메서드는 객체를 정수로 변환하는 데 사용됩니다. 적절한 함수는 충분한 시간과 메모리가 주어지면 정확하게 계산되어야 합니다.
intmath
패키지는 이전 Python 버전을 위해 새 모듈을 제공할 것입니다.
가능한 확장 (Possible Extensions)
새로운 함수들(동기 부여 섹션에서 언급된 것과 같은)은 이 제안의 일부가 아닙니다.
하지만, GMP와 같이 잘 지원되는 수학 라이브러리에 대한 바인딩을 제공할 수 없는 한, 모듈 범위는 제한되어야 합니다. 예를 들어, 소수성 검사(primality testing)나 인수분해(factorization)는 프로덕션 수준의 구현이 기여자들에게 상당한 수학적 배경을 요구하며, 오히려 전문 라이브러리에 속합니다.
제안된 함수가 이미 gmpy2
에 존재하는 경우, 표준 라이브러리(stdlib)에서는 호환 가능한 인터페이스를 선호해야 합니다.
하위 호환성 (Backwards Compatibility)
math
모듈의 별칭은 무기한 유지되므로(사용은 권장되지 않음), 예상되는 코드 변경 사항은 없습니다.
교육 방법 (How to Teach This)
새 모듈은 다음과 같은 함수들을 위한 공간이 될 것입니다.
int
와 유사한 인수를 허용하고 정수를 반환하는 함수.- 임의 정밀도 정수 연산(arbitrary-precision integer arithmetic) 분야에 속하는 함수, 즉 플랫폼의 부동 소수점 형식이나 동작 및/또는 플랫폼
math
라이브러리(libm
)에 의존하지 않는 함수.
사용자들은 대부분의 기본적인 사용 사례(int.bit_length()
메서드 등)를 다루는 int
의 메서드를 먼저 살펴본 다음, 표준 라이브러리(stdlib)의 전용 공간을 찾는 것이 자연스러울 것입니다.
참조 구현 (Reference Implementation)
python/cpython#133909
기각된 아이디어 (Rejected ideas)
isqrt()
이름 변경 (isqrt()
renaming)
math.isqrt()
를 imath.sqrt
로 노출하는 것에 대한 간략한 논의가 있었습니다. 이는 cmath.sqrt()
가 math.sqrt()
의 복소수 버전인 것과 유사하게 생각되었습니다. 그러나 isqrt
는 궁극적으로 다른 함수입니다. 이는 제곱근의 바닥(floor) 값입니다. 다른 모듈이라 할지라도 동일한 이름을 부여하는 것은 혼란을 야기할 수 있습니다.
열린 문제 (Open Issues)
투표 결과 intmath
가 가장 인기 있는 후보였으며 imath
가 두 번째였습니다.
다른 제안된 이름으로는 ntheory
(SymPy의 하위 모듈과 유사), integermath
, zmath
, dmath
, imaths
등이 있습니다.
한 가지 변형으로, 새 모듈을 math
의 하위 모듈로 추가할 수도 있습니다: integer
(가장 선호됨), discrete
또는 ntheory
(작성자 선호).
⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.
Comments