From 3ac1ee16f377d31a0fb80c8dae28b6239ac4229e Mon Sep 17 00:00:00 2001 From: Terin Stock Date: Sun, 9 Mar 2025 17:47:56 +0100 Subject: [chore] remove vendor --- vendor/github.com/remyoudompheng/bigfft/fft.go | 370 ------------------------- 1 file changed, 370 deletions(-) delete mode 100644 vendor/github.com/remyoudompheng/bigfft/fft.go (limited to 'vendor/github.com/remyoudompheng/bigfft/fft.go') diff --git a/vendor/github.com/remyoudompheng/bigfft/fft.go b/vendor/github.com/remyoudompheng/bigfft/fft.go deleted file mode 100644 index 2d4c1e7a9..000000000 --- a/vendor/github.com/remyoudompheng/bigfft/fft.go +++ /dev/null @@ -1,370 +0,0 @@ -// Package bigfft implements multiplication of big.Int using FFT. -// -// The implementation is based on the Schönhage-Strassen method -// using integer FFT modulo 2^n+1. -package bigfft - -import ( - "math/big" - "unsafe" -) - -const _W = int(unsafe.Sizeof(big.Word(0)) * 8) - -type nat []big.Word - -func (n nat) String() string { - v := new(big.Int) - v.SetBits(n) - return v.String() -} - -// fftThreshold is the size (in words) above which FFT is used over -// Karatsuba from math/big. -// -// TestCalibrate seems to indicate a threshold of 60kbits on 32-bit -// arches and 110kbits on 64-bit arches. -var fftThreshold = 1800 - -// Mul computes the product x*y and returns z. -// It can be used instead of the Mul method of -// *big.Int from math/big package. -func Mul(x, y *big.Int) *big.Int { - xwords := len(x.Bits()) - ywords := len(y.Bits()) - if xwords > fftThreshold && ywords > fftThreshold { - return mulFFT(x, y) - } - return new(big.Int).Mul(x, y) -} - -func mulFFT(x, y *big.Int) *big.Int { - var xb, yb nat = x.Bits(), y.Bits() - zb := fftmul(xb, yb) - z := new(big.Int) - z.SetBits(zb) - if x.Sign()*y.Sign() < 0 { - z.Neg(z) - } - return z -} - -// A FFT size of K=1< bits { - k = uint(i) - break - } - } - // The 1< words - m = words>>k + 1 - return -} - -// valueSize returns the length (in words) to use for polynomial -// coefficients, to compute a correct product of polynomials P*Q -// where deg(P*Q) < K (== 1<= 2*m*W+K - n := 2*m*_W + int(k) // necessary bits - K := 1 << (k - extra) - if K < _W { - K = _W - } - n = ((n / K) + 1) * K // round to a multiple of K - return n / _W -} - -// poly represents an integer via a polynomial in Z[x]/(x^K+1) -// where K is the FFT length and b^m is the computation basis 1<<(m*_W). -// If P = a[0] + a[1] x + ... a[n] x^(K-1), the associated natural number -// is P(b^m). -type poly struct { - k uint // k is such that K = 1< 0 { - length += len(p.a[na-1]) - } - n := make(nat, length) - m := p.m - np := n - for i := range p.a { - l := len(p.a[i]) - c := addVV(np[:l], np[:l], p.a[i]) - if np[l] < ^big.Word(0) { - np[l] += c - } else { - addVW(np[l:], np[l:], c) - } - np = np[m:] - } - n = trim(n) - return n -} - -func trim(n nat) nat { - for i := range n { - if n[len(n)-1-i] != 0 { - return n[:len(n)-i] - } - } - return nil -} - -// Mul multiplies p and q modulo X^K-1, where K = 1<= 1<= 1<> k - // p(x) = a_0 + a_1 x + ... + a_{K-1} x^(K-1) - // p(θx) = q(x) where - // q(x) = a_0 + θa_1 x + ... + θ^(K-1) a_{K-1} x^(K-1) - // - // Twist p by θ to obtain q. - tbits := make([]big.Word, (n+1)<> k - - // Perform an inverse Fourier transform to recover q. - qbits := make([]big.Word, (n+1)<> size - if backward { - ω2shift = -ω2shift - } - - // Easy cases. - if len(src[0]) != n+1 || len(dst[0]) != n+1 { - panic("len(src[0]) != n+1 || len(dst[0]) != n+1") - } - switch size { - case 0: - copy(dst[0], src[0]) - return - case 1: - dst[0].Add(src[0], src[1<