bigint — 큰수 모듈러 산술(기계가 고르는 폭)
bigint32 와 op 의 이름 · 입력 · 뜻이 모두 같다. 다른 것은 조각 폭을 기계가 고른다는 것 하나다 — 대상의 조각 폭(machine.limb_bits)이 16 이면 bigint16, 32 이면 bigint32, 그 밖이면 bigint64 의 셈을 부른다. 표준 라이브러리의 rsa · p256 · p384 · ecdsa · ed25519 · verify 가 이것을 쓴다.
조각 폭은 이렇게 정한다 — 잴 수 있는 대상은 재서 가장 빠른 폭으로, 재지 못한 대상은 그 기계의 곱셈기 폭(machine.mul_bits — 두 정수의 곱을 위 절반까지 명령 하나로 내는 가장 넓은 폭)으로. 표의 값은 대상 표의 한 칸이라 언제든 바꿀 수 있다.
| 대상 | 곱셈기 폭 | 조각 폭 | 근거 |
|---|---|---|---|
x86_64 | 64 | 64 | 잼(2026-10-23, P-256 서명 + 검증: 64 비트 5.5 ms · 32 비트 13.4 ms · 16 비트 42.3 ms) |
win64 | 64 | 64 | 잼(2026-10-23, Windows 11 가상 기계 · x86-64: 64 비트 5.7 ms · 32 비트 12.7 ms · 16 비트 22.5 ms) |
arm64 · riscv64 | 64 | 64 | 곱셈기 폭(재지 않았다) |
cortex_m · mips_be · cheriot | 32 | 32 | 곱셈기 폭(재지 않았다) |
cortex_m0 | 16 | 16 | 곱셈기 폭 — Cortex-M0 · M0+ 는 32×32 곱의 아래 32 비트만 낸다고 알려져 있다. bigint16 은 조각의 곱을 32 비트로 셈해 몽고메리 곱이 그 하드웨어 곱을 쓴다(arm-none-eabi-gcc -mcpu=cortex-m0 가 낸 코드로 확인 · 시간은 재지 않았다) |
word16 | 16 | 16 | 곱셈기 폭(번역만 하는 대상) |
표 50.1 — 대상마다 조각 폭 — machine.limb_bits 의 값과 그 근거
프로그램 전체의 폭을 바꾸려면 프로젝트의 pkg.low 에 build limb_bits 32 . (또는 16 · 64) 를 적거나 lowentc --limb-bits 32 … 를 준다 — machine.limb_bits 의 값이 바뀌고, bigint 를 쓰는 라이브러리가 모두 그 폭으로 돈다(곱셈기 폭은 기계의 사실이라 바뀌지 않는다). 명령줄이 매니페스트를 이기고, 매니페스트는 맨 위 패키지의 것만 읽는다 — 의존 패키지가 그것을 쓰는 프로그램의 폭을 바꾸지 않는다. 한 자리에서만 다른 폭을 쓰려면 폭을 받는 op(rsa.verify_pss_by …)에 폭 타입을 넘긴다(bigwidth).
조각 폭은 빠르기의 기본값이다
u64 칸에 든다. 그래서 어떤 대상에서 문제가 나면 다른 폭(공용 셈)으로 돌아가면 된다. 재 본 결과가 곱셈기 폭과 다를 수도 있다: x86 32 비트 빌드(-m32)는 곱셈기가 32 비트인데 bigint64 가 bigint32 보다 1.35 배 빨랐다(RSA-2048 거듭제곱, 2026-10-22). 이 수에 대상 표의 줄이 따로 없어(32 비트 x86 대상이 없다) 표에는 오르지 않았다.폭이 번역 때 정해지므로 고르는 비용이 없다 — 처리기가 비교를 접고, bigint.mont_mul 을 부르는 자리는 고른 모듈의 op 을 바로 부른다(입력을 겉모양이 같은 다른 op 에 그대로 넘기기만 하는 op 은 건너뛰어 부른다). 담는 칸은 폭과 상관없이 ⌈nb / 2⌉ + 2 칸이면 된다(bigint16 이 가장 많이 쓴다).
| op | 하는 일 | 요구 · 비고 |
|---|---|---|
add_mod · sub_mod | o ← (a ± b) mod m | a, b 는 m 보다 작다 · o 는 a 나 b 와 같은 칸이어도 된다 |
is_zero | nb 바이트짜리 수가 0 인가(0 · 1) | |
equal | 두 수가 같은가(0 · 1) | 이름이 eq 가 아닌 것은 그것이 빌트인이기 때문이다 |
bit | 수의 i 번째 비트(0 이 가장 낮다) | 지수 · 스칼라를 위에서부터 읽을 때 |
표 50.2 — 2026-10-23 에 넷 모두에 더한 op — 곡선 모듈이 스스로 하던 조각 셈
확인하는 것 — 네 모듈(bigint16 · bigint32 · bigint64 · bigint)의 새 op 이 파이썬 정수 산술과 같은지(17 · 32 · 33 · 48 바이트), 곡선 서명 검증과 RSA 검증이 세 폭(--limb-bits 16 · 32 · 64) 모두에서 같은 답을 내는지. 다섯 파일(bigint16/32/64 · bigwidth · bigint)은 한 틀 (scripts/gen-bigint.py)에서 나온다 — 한 파일만 고치면 틀과의 대조가 실패한다.