public static BigInt operator *(BigInt A, BigInt B) { if (A.Radix != B.Radix) { throw new Exception(); } Complex[] a, b; int N = 2 << (int)Math.Ceiling(Math.Log(Math.Max(A.Data.Length, B.Data.Length)) / Math.Log(2)); a = A.FFT(N); b = B.FFT(N); for (int i = 0; i < a.Length; i++) { a[i] *= b[i]; } Fourier.IFFT(ref a); BigInt C = new BigInt("0", A.Radix); for (int i = 0; i < a.Length - 1; i++) { C.Data = C.Data == "0" ? C.Data : C.Data = C.Data.Insert(0, "0"); C += new BigInt((int)Math.Round(a[i].Real), C.Radix); } return((A.IsNeg ^ B.IsNeg) ? -C : C); }
public static BigInt operator *(BigInt A, BigInt B) { Complex[] a, b; int N = 2 << (int)Math.Ceiling(Math.Log(Math.Max(A.s.Length, B.s.Length)) / Math.Log(2)); a = A.FFT(N); b = B.FFT(N); for (int i = 0; i < a.Length; i++) { a[i] *= b[i]; } Fourier.IFFT(ref a); BigInt C = new BigInt(0); for (int i = 0; i < a.Length - 1; i++) { C = C * 10 + new BigInt((int)Math.Round(a[i].Real)); } return(C); }