Exemple #1
0
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);
}
Exemple #2
0
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);
}