//-*-C++-*-//由autodoc自动生成//====~====头文件src/aux0/二项式.h:==========内联ulong二项式(ulong n,ulong k);//==============标题文件src/aux0/cayley-dickson mult.h:==========内联int CD_sign_rec(ulong r,ulong c,ulongn);//乘法表中的符号//n离子代数(其中n是2的幂)//通过Cayley-Dickson结构获得://如果分量r与分量c相乘,则//结果是CD_sign_rec(r,c,n)*(r XOR c)。//乘法规则为//(a,b)*(a,b)=(a*a-b*conj(b),conj(a)*b+a*b)//式中,conj(a,b):=(cong(a),-b)和conj(x):=x代表x实//[如果规则更改为,则获取换位规则/表//(a,b)*(a,b)=(a*a-conj(b)*b,b*conj(a)+b*a)]//必须有:r<n和c<n。//我们有ex*e0=e0*ex=ex,ex*ex=-1代表x!=0,//x的ex*ey==-ey*ex!=y、 x!=0,y!=0//示例(辛烷值,n=8)://(er*ec)e0 e1 e2 e3 e4 e5 e6 e7//e0:+e0+e1+e2+e3+e4+e5+e6+e7//e1:+e1-e0-e3+e2-e5+e4+e7-e6//e2:+e2+e3-e0-e1-e6-e7+e4+e5//e3:+e3-e2+e1-e0-e7+e6-e5+e4////e4:+e4+e5+e6+e7-e0-e1-e2-e3//e5:+e5-e4+e7-e6+e1-e0+e3-e2//e6:+e6-e7-e4+e5+e2-e3-e0+e1//e7:+e7+e6-e5-e4+e3+e2-e1-e0//第r行、第c列的符号等于CD_sign_rec(r,c,8):// + + + + + + + +// + - - + - + + -// + + - - - - + +// + - + - - + - +// + + + + - - - -// + - + - + - + -// + - - + + - - +// + + - - + + - -//这是一个(8 x 8)哈达玛矩阵。//第二行是(有符号的)Thue-Morse序列,//参见OEIS序列A118685、A010060和A106400。内联int CD_sign_it(ulong r,ulong c,ulongn);//CD_sign_rec()的迭代版本内联bool CD_zerodiv_q(ulong r,ulong c);//返回(r+c),其中r和c是单位//是Cayley-Dickson代数中的零因子。//====~====头文件src/aux0/cmult.h:==========静态内联void csqr(double&u,double-v);//{u,v}<--|{u*u-v*v,2*u*v}静态内联void csqr_n(double&u、double-v、double dn);//{u,v}<--|{dn*(u*u-v*v),dn*(2*u*v)}静态内联void csqr(双a,双b,;双u型、双u型和v型)//{u,v}<--|{a*a-b*b,2*a*b}静态内联void cmult(双c,双s,;双u型、双u型和v型)//{u,v}<--|u=u*c-v*s;v=u*s+v*c静态内联void cmultn(双c,双s,;双u型、双u型和v型,双dn)//{u,v}<-|{dn*(u*c-v*s),dn*(u*s+v*c)}静态内联void cmult(双c,双s,;双x,双y,双u型、双u型和v型)//{u,v}<--|{x*c-y*s,x*s+y*c}静态内联void cmult(双c,双s,;复数x,复数y,复杂(&u)、复杂(&v)//{u,v}<--|{x*c-y*s,x*s+y*c}//用于生成的复杂fhts静态内联void cmult(复数c,复数s,;复数x,复数y,复杂(&u)、复杂(&v)//{u,v}<--|{x*c-y*s,x*s+y*c}//用于生成的复杂fhts静态内联void cmult_inv(双c,双s,;双x,双y,双&u,双&v)//{u,v}<--|{x*c+y*s,-x*s+y*c}//与cmult(c,-s,x,y,u,v)相同静态内联void cmult_inv(双c,双s,;复数x,复数y,复杂(&u)、复杂(&v)//{u,v}<--|{x*c+y*s,-x*s+y*c}//与cmult(c,-s,x,y,u,v)相同//用于生成的复杂fhts静态内联void cmult_inv(Complex c,Complex s,;复数x,复数y,复杂(&u)、复杂(&v)//{u,v}<--|{x*c+y*s,-x*s+y*c}//与cmult(c,-s,x,y,u,v)相同//用于生成的复杂fhts//====~====头文件src/aux0/csincos.h:==========静态内联复数SinCos(双φ);//===========标题文件src/aux0/阶乘.h:==========内联类型阶乘(类型n);//返回n!//.//对于n<=12 n!适合32位。//对于n<=20 n!适合64位。//对于n≤34 n!适合128位。//对于n≤57 n!可容纳256位。inline类型ffactpow(类型x,类型n);//阶乘下降。inline Type rfactpow(类型x,类型n);//阶乘功率上升。//=====头文件src/aux0/fibonacci.h:==========内联ulong-fibonacci(ulong-n);//返回第n个斐波那契数//限制:F(n)必须适合ulong//32位:n≤47,F(47)=2971215073[F(48)=4807526976>2^32]//64位:n<=93 F(93)=12200160415121876738[F(94)>2^64]内联void fibonacci_pair(ulong n,ulong&f0,ulong&f1);//将f0设置为F(n),第n个斐波那契数,以及//f1到F(n-1)。//限制:F(n)必须适合ulong//32位:n≤47,F(47)=2971215073[F(48)=4807526976>2^32]//64位:n<=93 F(93)=12200160415121876738[F(94)>2^64]//====~====头文件src/aux0/gcd.h:==========gcd型(a型、b型);//返回a和b的最大公约数。egcd型(u型、v型、tu1型、tu2型);//返回u3并设置u1、v1,以便//gcd(u,v)==u3==u*u1+v*u2//类型必须是签名类型。//.//参见Knuth2,第325页类型binary_ugcd(类型a,类型b);//返回a和b的最大公约数。//未签名类型的版本。类型binary_sgcd(类型a,类型b);//返回a和b的最大公约数。//已签名类型的版本。lcm型(a型、b型);//返回a和b的最小公倍数。//====~====头文件src/aux0/ipow.h:==========1类ipow(1类a,2类ex);//返回**ex//====~====头文件src/aux0/ldn2rc.h:==========静态内联void ldn2rc(ulong ldn,ulong&nr,ulong&nc);//输入ldn:=log_2(n)//设置nr、nc,使nr*nc=n且ldr>=ldc//用于基于矩阵fft的卷积。//====~====头文件src/aux0/print-fix.h:==========//-----SRCFILE=src/aux0/print-fixed.cc:-----void print_fixed(const char*bla,double v,long nd,bool sq);//精确打印v的第nd位//如果sq,打印符号=0//=====头文件src/aux0/rand-idx.h:==========内联ulong rand_idx(ulong m);//返回[0,1,…,m-1]范围内的随机数。//必须具有m>0。//====~====头文件src/aux0/randf.h:==========//-----SRCFILE=src/aux0/randf.cc:-----uint rseed(uint s/*=0*/);双rnd01();//[0,1中的随机数[无效rnd01(双*f,ulong n);//用[0,1中的随机数填充[双白噪声();//返回一个白噪声样本(平均值=0,σ=1)。void white_noise(双*f,ulong n);//用白噪声样本填充数组(平均值=0,σ=1)。//====~====头文件src/aux0/sincos.h:==========静态内联void SinCos(双a、双*s、双*c);静态内联void SinCos(双a、双*s、双*c);静态内联空隙SinCos(双a、双*s、双*c);//====~====头文件src/aux0/sumdiff.h:==========静态内联void sumdiff(类型&a,类型&b);//{a,b}<--|{a+b,a-b}静态内联void sumdiff_r(类型-a,类型-b);//{a,b}<--|{b+a,b-a}//按比例缩放diffsum(a,b)的倒数(因子2)。静态内联void sumdiff05(类型&a,类型&b);//{a,b}<--|{0.5*(a+b),0.5*(a-b)}静态内联void sumdiff05_r(类型&a,类型&b);//{a,b}<--|{0.5*(a+b),0.5*(b-a)}静态内联void diffsum(类型&a,类型&b);//{a,b}<--|{a-b,a+b}//按比例缩放(因子2)sumdiff_r(a,b)的倒数。静态内联void sumdiff(类型a、类型b、类型&s、类型&d);//{s,d}<--|{a+b,a-b}静态内联void sumdiff05(类型a、类型b、类型&s、类型&d);//{s,d}<--|{0.5*(a+b),0.5*(a-b)}静态内联void sumdiff3(类型&a、类型b、类型&d);//{a,b,d}<--|{a+b,b,a-b}(用于分割半径FFT)//切勿调用类似func(a,b,a)或func(a,b,b)的函数静态内联void sumdiff3_r(类型-a、类型b、类型-d);//{a,b,d}<--|{a+b,b,b-a}(用于分割半径FFT)//切勿调用类似func(a,b,a)或func(a,b,b)的函数静态内联空心扩散管3(类型a、类型&b、类型&s);//{a,b,s}<--|{a,a-b,a+b}(用于分割半径FFT)//切勿调用类似func(a,b,a)或func(a,b,b)的函数静态内联void diffsum3_r(类型a、类型&b、类型&s);//{a,b,s}<--|{a,b-a,a+b}(用于分割半径FFT)//切勿调用类似func(a,b,a)或func(a,b,b)的函数//====~====头文件src/aux0/swap.h:==========静态内联空抽汲2(类型&x,类型&y);//交换值静态内联无效swap0(类型&x,类型&y);//已知y为零的swap()//====~====头文件src/aux0/tex-line.h:==========//-----SRCFILE=src/aux0/tex-line.cc:-----void tex_line(长x0,长y0,长x1,长y1,bool vq/*=true*/);//打印TeX命令以绘制从(x0,y0)到(x1,y1)的矢量(或直线)。//设置vq以将线绘制为矢量。//对于(dx,dy){length}和\vector(dx、dy}{length}//注:对于(dx,dy){length}和\vector(dx、dy}{length}//参数“length”是的垂直坐标//垂直线段,否则为水平坐标。inline void tex_line(ulong x0,ulong y0,ullong x1,ulon y1,bool vq=true);void tex_line_fl(双x0,双y0,双x1,双y1,bool vq/*=true*/);//打印TeX命令以绘制从(x0,y0)到(x1,y1)的向量(或直线)。//设置vq以将线绘制为矢量。//注:对于(dx,dy){length}和\vector(dx、dy}{length}//参数“length”是的垂直坐标//垂直线段,否则为水平坐标。无效tex_draw_turn(双x,双y,双dx,双dy,双ndx,双ndy,乌龙风格,bool vq/*=真*/,双倍m/*=0.25*/);//绘制转弯部分//X1=(x,y)超过X2=(x+dx,y+dy)到X3=(x+ndx,y+ndy)//如下所示。//NX==X+DX://*X2*X3://*X1\://X/\==NX+NDX: