//-*-C++-*-//由autodoc自动生成//======头文件src/bpol/all-indepoly.h:==========类all_irredpoly;//生成所有给定次数的不可约二元多项式//===========标题文件src/bpol/bitpol arith.h:==========//Z/2Z上多项式的算法//单词W表示的多项式W是//W=pol(W)=:\sum_k{[位_k(W)]*x^k}内联ulong bitpol_mult(ulong a,ulong b);//返回A*B//B=2对应于与“x”的乘法//请注意,结果将自动溢出//如果deg(A)+deg(B)>=BITS_PER_LONG内联ulong比特极平方(ulong a);//返回A*A//==位压缩(a)//==位_zip0(a)//==比特波尔结果(a,a);内联ulong比特功率(ulong a,ulong e);//返回A**e//即使指数适中,也会发生溢流内联ulong bitpol_rem(ulong a,constulong b);//返回R=A%B=A-(A/B)*B//必须有:B=0内联ulong bitpol_div(ulong a,ulong b);//返回Q=A/B//必须有B=0内联void bitpol_divrem(ulong a,ulong b,ulong&q,ulong&r);//设置R,Q,使A==Q*B+R。//必须有B=0//等价于:q=bitpol_div(a,b);r=位pol_rem(a,b);内联ulong bitpol_div_xp1(ulong a);//回流功率系列A/(x+1)//如果A是x+1的倍数,则返回值//是x+1的精确除法//函数与inverse_rev_gray_code(a)相同内联ulong bitpol_div_x2p1(ulong a);//回流功率系列A/(x^2+1)//如果A是x^2+1的倍数,则返回值//是x^2+1的精确除法//====~====头文件src/bpol/bitpol-degree.h:==========内联ulong bitpol_deg(ulong c);//二元多项式C的返回度。//如果C是零多项式,则返回零。内联ulong bitpolh(ulong c);//返回模块计算所需的1位掩码。内联void bitpol_hdeg(ulong c,ulong&d,ulong&h);//计算阶数和掩码。//====~====头文件src/bpol/bitpol-deriv.h:==========内联ulong比特极驱动(ulong c);//多项式c的返回导数//====~====头文件src/bpol/bitpol-factor.h:==========//-----SRCFILE=src/bpol/berlekamp.cc:-----void setup_q_matrix(ulong c、ulong d、ulong*ss);//计算d次多项式c的Q矩阵。//用于Berlekamp的因式分解算法。ulong bitpol_refine因子(ulong*f,ulong nf,constulong*nn,ulongr);//给定(Q-id)的nullspace nn[0,…,r-1]//以及乘积等于c的nf因子f[0,…,nf-1]//(通常nf=1和f[0]==c)//然后得到c的所有r不可约因子。ulong比特极因子平方(ulong c,ulong*f);//将无平方多项式c的不可约因子填充到f[]中//返回因子数。//-----SRCFILE=src/bpol/bitpol-factor.cc:-----ulong比特极因子(ulong c,ulong*f,ulong*e);//对二元多项式c进行因式分解://c=\prod_{i=0}^{fct-1}{f[i]^e[i]}//返回因子数(fct)。无效bitpol_sort_factorization(ulong*f、ulong*e、ulong fct);//对不可约因子进行排序。ulong bitpol_test_factorization(ulong c,constulong*f,constulong*e,ulong fct,ulong&fi);//测试c==\prod_{i=0,1,…,fct-1}{f[i]^e[i]}//所有f[i]不可约。//如果因子分解正常,则返回零,否则返回//出现错误的第一个索引//使用f[i]^e[i]写入fi//返回值表示错误类型://1:平凡因子分解失败(c应为零或一)//2:因子f[fi]是可约的//3:f[fi]不除c//4:f[fi]^e[fi]不除c//5:产品!=c(c)//====~====头文件src/bpol/bitpol-gcd.h:==========//Z/2Z上多项式的GCD、EGCD和逆//单词W表示的多项式W是//W=pol(W)=:\sum_k{[位_k(W)]*x^k}内联ulong bitpol_gcd(ulong a,ulong b);//返回多项式gcd(A,B)内联ulong bitpol_binary_gcd(ulong a,ulong b);//返回多项式gcd(A,B)内联ulong bitpol_egcd(ulong u,ulong v,ulong&iu,ulong&iv);//返回u3并设置u1,v1,这样gcd(u,v)==u3==u*u1+v*u2////如果u3==1,则u1是u模v的倒数//u2是v模u的倒数//.//参见Knuth2,第325页//====~====头文件src/bpol/bitpol-irred.h:==========//-----SRCFILE=src/bpol/bitpol-irred-ben-or.cc:-----布尔比特极_可约简_本_或q(ulong c,ulong h);//返回C是否不可约(通过Ben-O或不可约测试_;//h需要是一个设置了一个位的掩码://h==最高_一(C)>>1==1UL<<(度(C)-1)//注:deg(c)==BITS_PER_LONG时,例程将失败(GCD失败)//-----SRCFILE=src/bpol/bitpol-irred-rabin.cc:-----布尔比特极_可约简_ rabin_q(ulong c,ulong h);//返回C是否不可约(通过拉宾不可约性测试)。//h需要是一个设置了一个位的掩码://h==最高(C)>>1==1升<<(度(C)-1)//-----SRCFILE=src/bpol/bitpol-spi.cc:-----布尔位pol_need_gcd(ulong h);//返回不可还原性测试是否需要GCD。bool bitpol_spi_q(ulong c,ulong h);//返回C是否是强伪不可约(SPI)。//次数为d的多项式C是SPI,如果//它没有线性因子,x^(2^k)=x代表0>1==1升<<(摄氏度-1)内联bool bitpol _rreducible_q(ulong c,ulong h);内联ulong位pol_compose_xp1(ulong c);//返回C(x+1)。//自反转。//如果C不可约,那么C(x+1)也是不可约的。//如果C是原语,那么x+1是生成模C(x+1)。内联ulong bitpol_recip(ulong c);//返回x^deg(C)*C(1/x)(倒数多项式)//自反转。//如果C是不可约/原语,则返回//多项式也是不可约/本原的。//.//注:可以使用revbin(c,deg(c)-1)//===========标题文件src/bpol/bitpol order.h:==========//-----SRCFILE=src/bpol/bitpol-order.cc:-----ulong比特极阶(ulong c,ulong h,const factorization&mfact,ulonga);//模多项式C的返回阶。//C必须是不可约的。//h必须等于1<<(deg(c)-1)。//mfact必须包含2**deg(c)-1的因式分解。//如果出现以下情况之一,则例程可能循环://-多项式C是可约的//-h设置不正确//-mfact设置不正确ulong比特极序(ulong c,ulong h,const factorization&mfact);//多项式C的返回阶。//C必须是不可约的。//h必须等于1<<(deg(c)-1)。//mfact必须包含2**deg(c)-1的因式分解。//如果出现以下情况之一,则例程可能循环://-多项式C是可约的//-h设置不正确//-mfact设置不正确//与:bitpol_el_order(c,h,mfact,2)相同//====~====头文件src/bpol/bitpol-promitive.h:==========内联ulong test_bitpol_primitive(ulong c,ulong h,const factorization&mfact);//对于不可约多项式c,测试它是否是本原的,//也就是说,x是否为最大阶。//mfact必须是最大阶(2*n-1)的因式分解。//c的返回零是原语。//==============标题文件src/bpol/bitpol print.h:==========//以不同格式打印二进制多项式:////ascii格式://bitpol_print()==bitpol_print_factorization()//x^7+x^4+x^3+1==(x+1)^5*(x^2+x+1)////系数列表://bitpol_print_coeff()==比特波尔打印效果制造()// (7,4,3,0) == (1,0)^5 * (2,1,0)////TeX格式://bitpol_print_tex()==bitpol_print_tex_factorization()//x^{7}+x^{4}+x ^{3}+1==\左(x+1\右)^{5}\cdot\left(x^{2}+x+1 \右)//-----SRCFILE=src/bpol/bitpol-print.cc:-----void bitpol_print(const char*bla,ulong c,bool sq/*=true*/);//打印为://如果sq==真,则x^7+x^4+x^3+1//如果sq==false,则x^7+x^4+x^3+1void bitpol_print_bin(const char*bla,ulong c);//打印为:1..11.1void bitpol_print_coeff(const char*bla,ulong c);//打印为:[7,4,3,0]void bitpol_print_tex(const char*bla,ulong c);//打印为:x^{7}+x^{4}+x^{3}+1void bitpol_print_factorization(const char*bla,const ulong*f,const ulong*e,ulong fct);//打印为:(x+1)^5*(x^2+x+1)void bitpol_print_bin_factorization(const char*bla,const ulong*f,const ulong*e,ulong fct);//打印为:(1.)^5(111)void bitpol_print_coffef_factorization(const char*bla,const ulong*f,const ulong*e,ulong fct);//打印为:[1,0]^5*[2,1,0]void bitpol_print_tex制造(const char*bla,constulong*f,constulong*e,ulong fct);//打印为:\左(x+1\右)^{5}\cdot\left(x^{2}+x+1 \右)void bitpol_print_short_factorization(const char*bla,constulong*f,constulong*e,ulong fct);//打印为:[deg1 ex1][deg2 ex2]。。。[度exk]//====~====头文件src/bpol/bitpol-squarefere.h:==========内联ulong bitpol_test_squarefree(ulong c);//如果多项式无平方,则返回0//else返回平方因子内联ulong bitpol_pure_square_q(ulong c);//返回多项式是否为纯平方!=1内联ulong bitpol_pure_sqrt(ulong c);//返回t=sqrt(c)//c必须是纯正方形:奇数位置的位必须为零。//-----SRCFILE=src/bpol/bitpol-squarefree.cc:-----ulong比特极还原(ulong c);//设c==\prod_{k}{E_k}*(\prod_{j}{S_j^{S_j}})^{2^x}//其中E_k、S_j是不可约因子//并且E_k不一定与S_j不同。//返回多项式f,其中//f=\prod_{k}{E_k}*(\prod_{j}{S_j^{sj}})^{1}//重复调用,直到返回多项式//等于c删除所有偶数指数。ulong bitpol_factor_squarefree(ulong c,ulong*sf,ulong*se);//设置sf[]、se[],以便//c==\prod_{i}{sf[i]^se[i]}//其中所有sf[i]都是无平方的。//返回因子数。内联ulong bitpol_squarefree_part(ulong c);//删除所有指数为偶数的因子内联ulong bitpol_make_squarefree(ulong c);//将所有指数减为1//====~====头文件src/bpol/bitpol-srp.h:==========内联ulong bitpol2srp(ulong f,ulong d);//返回自互易多项式S=x^d*F(x+1/x),其中d=deg(F)。//W=总和(j=0,d,F(j)*x^(d-j)*(1+x^2)^j),其中//F(j)是F的第j个系数。//必须具有:d==度(F)内联ulong bitpol_srp2pol(ulong s,ulong hd);//bitpol_pol2srp()的逆运算。//必须具有:hd=度/2(注:_half_ of the degree)。//只访问下半系数,即。//该例程适用于度(S)<=2*BITS_PER_LONG-2。//====~====头文件src/bpol/bitpolmod-arith.h:==========//Z/2Z上多项式的模运算。//单词W表示的多项式W是//W=pol(W)=:\sum_k{[位_k(W)]*x^k}//模量为C//h需要是具有一个位集的掩码://h==最高_一(c)>>1==1UL<<(度(c)-1)静态内联ulong bitpolmod_times_x(ulong a,ulong c,ulongh);//返回(A*x)模块C////如果C是n次本原多项式//连续调用将在所有2**n-1之间循环//n位字和位序列//构成的(任何固定位置)//移位寄存器序列(SRS)。//从a=2开始,得到以开始的SRS//n-1个连续的零(使用a的位0)静态内联ulong bitpolmod_times_x2(ulong a,ulong c,ulong h);//返回(A*x*x)模块C//用于展平。静态内联ulong bitpolmoddivx(ulong a,ulong c,ulongh);//返回(A/x)模块C//C必须有非零常数项:(C&1)==1////如果C是n次本原多项式//连续调用将在所有2**n-1之间循环//n位字和位序列//构成的(任何固定位置)//移位寄存器序列(SRS)。静态内联ulong bitpolmod_invx(ulong c,ulong h);//返回(1/x)模块C//C必须有非零常数项:(C+1)==1//c>>1==(c-1)/x=(0-1)/x==-1/x==1/x(c型)。静态内联ulong bitpolmod_mult(ulong a、ulong b、ulongc、ulongh);//返回(A*B)模式C////必须具有度(A)<度(C)和度(B)<度//.//当b=2(=='x')时,结果与//bitpolmod_times_x(a,c,h)静态内联ulong bitpolmod_square(ulong a,ulong c,ulongh);//返回A*A模块C//==bitpolmod_mult(a,a,c,h);//计算\sum{k=0}^{d}{a_k\,x^k}为\sum_{k=0}^{d}{ak\,x^{2k}}内联ulong bitpolmod_power(ulong a、ulong e、ulongc、ulongh);//返回(A**e)模块C内联ulong bitpolmod_xpower(ulong e,ulong c,ulongh);//返回(x**e)模式C内联ulong bitpolmod_inverse_irred(ulong a,ulong c,ulongh);//返回(A**-1)模块C//必须有:C不可约。////对于不可约C,A的逆可以通过//i=比特功率(a,r1,c,h)//其中r1=(h<<1)-2=最大阶-1=2^度(C)-2//则1==bitpolmod_mult(a,i,c,h)内联ulong bitpolmod_inverse(ulong a,ulong c);//如果A模C存在,则返回其逆函数,否则返回零。//必须具有deg(A)<deg(C)内联ulong bitpolmod_divide(ulong a,ulong b,ulong c,ulong h);//返回A/B模块C。//必须有:gcd(b,c)==1静态内联ulong bitpolmod_sqrt(ulong a,ulong c,ulongh);//返回sqrt(A)mod C//使用单位sqrt(A)=A^(2^(n-1)),其中n=deg(C)//====~====头文件src/bpol/bitpolmod-minpoly.h:==========//-----SRCFILE=src/bpol/bitpolmod-minpoly.cc:-----ulong bitpolmod_minpoly(ulong a、ulong c、ulongn、ulong&bp);//计算模C的最小多项式p(x)//返回p()的次数。//多项式p()被写入bp//(其系数在GF(2)中)。ulong bitpolmod_minpoly2(ulong a、ulong c、ulongn、ulong&bp);//计算模C的最小多项式p(x)//返回p()的次数。//多项式p()被写入bp//(其系数在GF(2)中)。//注意:首选例程bitpolmod_minpoly()!//====~====头文件src/bpol/bitpolmod-solvequadratic.h:==========//-----SRCFILE=src/bpol/bitpolmod-solvequadratic.cc:-----布尔bitpolmod_solve_reduced_quadratic(ulong c,ulong&r,ulong m);//求解z^2+z==c模m//返回是否存在解决方案。//如果是这样,则将一个解写入r。//另一个解决方案是r+1。布尔bitpolmod_solve_二次型(ulong a,ulong b,ulongc,ulong&r0,ulong&r1,ulongm);//求解a*z^2+b*z+c==0模m//返回是否存在解决方案。//如果是这样,则将解写入r0和r1。//必须有:m不可约。//====~====头文件src/bpol/clhca.h:==========//循环(加性)线性混合元胞自动机(CLHCA)。内联ulong-clhca_next(ulong x,ulong r,ulongn);//计算线性混合元胞自动机的下一个状态//循环边界条件(CLHCA)。内联ulong-clhca2poly(ulong r,ulong n);//计算对应的二元多项式//到长度为n的具有规则r的CLHCA。内联ulong clhca2poly_too(ulong r,ulong n);//计算对应的二元多项式//长度为n CLHCA,规则为r。//这是一个更通用(也更昂贵)的版本。//====~====头文件src/bpol/fcsr.h:==========fcsr类;//反馈进位移位寄存器(FCSR)//生成移位寄存器序列(SRS)//由ak mod c生成,其中//c应该是具有基元根2的素数//我们有a_k=a_0*2^k(mod c)[默认情况下a_0=1]//FCSR的周期是两个mod c的顺序//(如果c是素数且具有本原根2,则==c-1)//====~====头文件src/bpol/gf2n-trace.h:==========内联ulong gf2n_fast_trace(ulong a,ulong tv);//快速计算a,//使用gf2n_trace_vector()中预先计算的表tv//-----SRCFILE=src/bpol/gf2n-trace.cc:-----ulong gf2n示踪(ulong a,ulong c,ulongh);//返回GF(2**k)的元素A的迹线。//GF(2**k)表示为模C的多项式。//跟踪(A)=\sum_{j=0}^{k-1}{A^(2^j)}//h需要是一个设置了一个位的掩码://h==最高_一(c)>>1==1UL<<(度(c)-1)//返回的值为零或一ulong-gf2n-trace_vector(ulong g,ulong c,ulong-h);//返回GF(2**k)元素G的幂的轨迹。//GF(2**k)表示为模C的多项式。//h需要是一个设置了一个位的掩码://h==最高_一(c)>>1==1UL<<(度(c)-1)//返回的单词可以用于加速//如果G是GF(2**k)的生成器,则进行跟踪计算//表示为模(不可约)C的多项式//(通常G='x'=2UL,C是一个基本多项式)ulong gf2n追踪向量x(ulong c,ulong n);//x的幂迹的返回向量,其中//x是不可约多项式C的根。//必须具有:n==度(C)ulong gf2n_half_trace(ulong a、ulong c和ulong h);//返回GF(2**k)元素A的半微量。//GF(2**k)表示为模C的多项式。//k必须是奇数。//半迹(A)=\sum_{j=0}^{(k-1)/2}{A^(4^(j))}//设T为轨迹,H为A的半轨迹。//然后:H+H^2=A+T//因此://如果(T==0)H和H+1都解y^2+y=A;//else(T==1)y^2+y=A没有解。//进一步://高(A)+H(A)^2==高(A+A^2)//h需要是一个设置了一个位的掩码://h==最高_一(c)>>1==1UL<<(度(c)-1)//====~====头文件src/bpol/gf2n.h:==========//-----SRCFILE=src/bpol/gf2n-minpoly.cc:-----ulong gf2n_minpoly(gf2n a,ulong&bp);//计算GF(2**n)中a的最小多项式p(x)。//返回p()的次数。//多项式p()被写入bp//(其系数在GF(2)中)。//不依赖于GF2n类的版本是//bpol/bitpolmod-minpoly.cc中给出ulong gf2n_minpoly2(gf2n a,ulong&bp);//计算GF(2**n)中a的最小多项式p(x)。//返回p()的次数。//多项式p()被写入bp//(其系数在GF(2)中)。//不依赖于GF2n类的版本是//bpol/bitpolmod-minpoly.cc中给出//注意:首选例程gf2n_minpoly()!GF2n GF2n_eval_poly(GF2n a,ulong bp);//求值多项式bp(GF(2)中的系数)//用于GF(2**n)中的参数a\。//-----SRCFILE=src/bpol/gf2n-solvequadratic.cc:-----布尔gf2n_solve_reduced_quadratic(gf2n c,gf2n&r);//求解z^2+z==c//返回解决方案是否存在。//如果是这样,则将一个解写入r。//另一个解决方案是r+1。布尔gf2n_solve_squadratic(gf2n a,gf2n b,gf2n-c,gf2n&r0,gf2n&r1);//解a*z^2+b*z+c==0//返回是否存在解决方案。//如果是这样,则将解写入r0和r1。//-----SRCFILE=src/bpol/gf2n-order.cc:-----ulong-gf2n阶(ulong g,ulong c,ulongh,const factorization&mfact);//GF(2**n)中带域多项式c的g的返回阶。//c必须是不可约的//h必须等于1<<(deg(c)-1)//mfact必须包含2**deg(c)-1的因式分解//如果出现以下情况之一,则例程可能循环://-多项式c是可约的//-度(g)>=度(c)//-h设置不正确//-mfact设置不正确类别GF2n;//二进制有限域GF(2**n)的实现//用算术运算。//在使用之前调用GF2n::init(n)_MUST_。//n必须<=BITS_PER_LONG。//====~====头文件src/bpol/lfsr.h:==========lfsr类;//(二进制)线性反馈移位寄存器//生成移位寄存器序列(SRS)//由a_k=x^k(mod c)生成,其中//c是n次本原多项式。//SRS的周期为2^n-1//(非原始c导致更小的周期)//====~====头文件src/bpol/lfsr64.h:==========lfsr64类;//(二进制)线性反馈移位寄存器//生成移位寄存器序列(SRS)//由ak mod c生成,其中//c默认为64次的最小权重基本多项式://c=x^64+x^4+x^3+x+1//以及//a_k=x^k(mod c)//lfsr的周期为2^64-1//====~====头文件src/bpol/lhca.h:==========内联ulong lhca_next(ulong x,ulong r,ulongm);//LHCA:=(1-dim)线性混合元胞自动机。//使用返回LHCA的下一个状态(x之后)//规则(由定义)r://规则150适用于r为1的单元格,规则90适用于其他单元格。//规则150:=下一个(x)=x+左位(x)+右位(x)//规则90:=下一个(x)=左位(x)+右位(x)//长度由m定义://m必须是n个最低位的突发(n:自动机的长度)内嵌ulong lhca2poly(ulong r,ulong n);//返回与长度n LHCA规则r相对应的二元多项式p。//返回多项式p的次数为n。////若r给出最大周期,则p是基元。////算法://设r=[r(n-1),…,r(2),r(1),r//初始化:p2=0,p1=1//迭代k=0…n-1:{p1,p2}={(x+r)*p1+p2,p1}//-----SRCFILE=src/bpol/bitpol2lhca.cc:-----ulong-poly2lhca(ulong-p);//返回对应于二元多项式P的LHCA规则。//必须有:P不可约。//====~====头文件src/bpol/mersenne-coprime.h:==========梅森素数类;//对于k=1。。m、 确定gcd(k,m)!=0,其中m=2^e-1。//必须具有e<=64(=sizeof(umod_t))。//====~====标题文件src/bpol/necklace2bitpol.h:==========necklace2bitpol类;//从项链生成不可约多项式。//====~====头文件src/bpol/normal-solvequadratic.h:==========内联ulong normal_solve_reduced_quadratic(ulong c);//解x^2+x=c//必须有:跟踪(c)==0,即奇偶校验(c)==0//返回一个解x,另一个解等于1+x,//也就是x的补码。内联ulong normal_solve_reduced_quadratic_q(ulong c,ulong&x);//返回t,c的轨迹。//如果t==0,则x^2+x=c是可解的//将解写入x。//====~====头文件src/bpol/normalbasis.h:==========//-----SRCFILE=src/bpol/bitpol-normal.cc:-----布尔位pol_normal2q(ulong c,ulong n);//返回多项式c(n次)是否正常。//必须有:c不可约。bool bitpol_normal_q(ulong c,ulong n,ulong-iq/*=nullptr*/,ulong*M/*=null ptr*-);//返回多项式c(n次)是否正常。//将已知不可约多项式的iq设置为1。//如果给定M,则计算乘法矩阵。//-----SRCFILE=src/bpol/normal-mult.cc:-----ulong normal_mult(ulong a,ulong b,const ulong*M,ulong n);//将正常基表示中的两个元素(GF(2^n)中的a和b)相乘。//乘法矩阵必须以M表示。//====~====头文件src/bpol/normalpoly-dual.h:==========//-----SRCFILE=src/bpol/normalpoly-dual.cc:-----ulong gf2n_xx2k trace(ulong c,ulong deg);//记录道的返回向量T[k]=记录道(ek),//其中ek=x*x^(2^k),k=0..度-1,以及//x是不可约多项式C的根。//必须具有:度==度(C)//多项式C是正规的当且仅当//gcd(x^deg-1,T)==1,其中T取为多项式。//对偶基由总和(k=0..deg-1,D[k]*x^(2^k))生成,其中//D=T^-1模x^deg-1。这种双重基础也是正常的。//如果T的唯一非零分量是T[0],那么//其基础是自对偶的。ulong gf2n_dial_normal(ulong c,ulong deg,ulong-ntc/*=0*/,ulong*ntd/*=0*/);//返回对偶(正规)基的最小多项式CS//和不可约正规多项式C。//如果C不正常,则返回零。//必须具有:deg==度(C)。//如果提供了ntc,则它必须等于gf2n_xx2k_trace(c,deg)。//如果ntd不为零,则向其写入ntc^-1(mod x^deg-1)。//====~====头文件src/bpol/num-bitpol.h:==========//num_iredpol_tab[n]==n阶二元不可约多项式的个数//num_primpol_tab[n]==n阶二元本原多项式的个数//num_normalpol_tab[n]==n阶二元正规多项式的个数//====~====头文件src/bpol/poly-tab.h:==========