void FastMul(const BigInt &A,const BigInt &B, BigInt &C) { ulong Len = 2; while ( Len < A.Size + B.Size ) Len *=2; if ( Len < 40 ) { BigInt Atmp(A), Btmp(B); Mul(Atmp,Btmp,C); return; } ulong x; const ushort *a=A.Coef, *b=B.Coef; for (x = 0; x < A.Size; x++) LongNum1[x] = a[x]; for (; x < Len; x++) LongNum1[x] = 0.0; FHT_F(LongNum1,Len); if (a == b) { FHTConvolution(LongNum1,LongNum1,Len); } else { for (x = 0; x < B.Size; x++) LongNum2[x] = b[x]; for (; x < Len; x++) LongNum2[x] = 0.0; FHT_F(LongNum2,Len); FHTConvolution(LongNum1,LongNum2,Len); } FHT_T(LongNum1,Len); CarryNormalize(LongNum1, Len, C); }
void RFHT_F(FFT_DATA_TYPE *Data,int Len) /* ** Recursive Decimation in Frequency style Fast Hartley Transform */ {int x,Len2,Len4; TRIG_VARS FFT_DATA_TYPE *Left,*Right; Len/=2;Left=&Data[0];Right=&Data[Len]; if (Len==2) {FFT_DATA_TYPE d0=Data[0]; FFT_DATA_TYPE d1=Data[1]; FFT_DATA_TYPE d2=Data[2]; FFT_DATA_TYPE d3=Data[3]; StartTimer(FFTITime); StartTimer(CRTLoad); {FFT_DATA_TYPE d02; FFT_DATA_TYPE d13; DD_Add(&d0,&d2,&d02); DD_Add(&d1,&d3,&d13); DD_Add(&d02,&d13,&Data[0]); DD_Sub(&d02,&d13,&Data[1]); } {FFT_DATA_TYPE d02,d13; DD_Sub(&d0,&d2,&d02); DD_Sub(&d1,&d3,&d13); DD_Add(&d02,&d13,&Data[2]); DD_Sub(&d02,&d13,&Data[3]); } StopTimer(FFTITime); StopTimer(CRTLoad); return; } if (Len<=(CPU_CACHE/sizeof(FFT_DATA_TYPE))) {FHT_F(Data,Len*2);return;} StartTimer(FFTITime); {FFT_DATA_TYPE t1,t2; t1=Left[0];t2=Right[0]; DD_Add(&t1,&t2,&Left[0]); DD_Sub(&t1,&t2,&Right[0]); t1=Left[Len/2];t2=Right[Len/2]; DD_Add(&t1,&t2,&Left[Len/2]); DD_Sub(&t1,&t2,&Right[Len/2]); } INIT_TRIG(Len); Len2=Len/2; Len4=Len/4; for (x=1;x<Len4;x++) { NEXT_TRIG_POW; FHT_F2Butterfly(x,Len-x,Pow_r,Pow_i); FHT_F2Butterfly(Len2-x,Len2+x,Pow_i,Pow_r); } /* Now do the two Len/4 points the loop missed */ if (Len4) // {FFT_DATA_TYPE sq=MY_SQRT_2; /* variable allows optimizations */ // FHT_F2Butterfly(Len4,Len-Len4,sq,sq); { FHT_F2Butterfly(Len4,Len-Len4,Sqrt05,Sqrt05); } StopTimer(FFTITime); if (Len>=2) RFHT_F(Left, Len); if (Len>=2) RFHT_F(Right,Len); }