📄 polynom.cpp
字号:
#include "stdafx.h"
#include "stdlib.h"
#include "Polynom.h"
void InitPolynom(Polynom* p, const GF& gf, int d) {
p->D=d;
p->coef=(GFE*)malloc(sizeof(GFE)*(d+1));
p->gf=gf;
}
//加入参数coef的版本
Polynom NewPolynom(const GF& gf, int d) {
Polynom p;
InitPolynom(&p, gf, d);
return p;
}
void FreePolynom(Polynom* p) {
free(p->coef);
}
/*以GF中元素为系数的多项式相乘,系数数组中存放的是其m重表示*/
void PolyMPY(Polynom* prodpoly, const Polynom* A, const Polynom* B, GFE* SR) {
//两因子多项式与乘积多项式的高低项次序相同
//调用者需确保prodpoly和SR所需空间已正确地分配好
GFE *a=A->coef; int k=A->D;
GFE *b=B->coef; int r=B->D;
/*
GFE *Pow2Vec=A->gf->Pow2Vec;
int *Vec2Pow=A->gf->Vec2Pow;
int N=A->gf->N;
*/
Using_Pow2Vec_Vec2Pow_NG(A->gf);
GFE *m=prodpoly->coef;
int i,j;
for (i=0; i<r; i++) SR[i]=0;
for (i=0; i<k+r+1; i++) {
m[i]=0;
for (j=r; j>0; j--) m[i]^=GFMPY_V2V(b[j], SR[j-1], NG);
for (j=r-1; j>0; j--) SR[j]=SR[j-1];
if (i<k+1) {
SR[0]=a[i];
m[i]^=GFMPY_V2V(b[0], a[i], NG);
} else if (i==k+1) SR[0]=0;
}
prodpoly->D=k+r;
}
Polynom PolyMPY(const Polynom* A, const Polynom* B, GFE* SR) {
//调用者需确保SR所需空间已正确地分配好
Polynom prodpoly=NewPolynom(A->gf, A->D + B->D);
PolyMPY(&prodpoly, A, B, SR);
return prodpoly;
}
Polynom PolyMPY(const Polynom* A, const Polynom* B) {
Polynom prodpoly=NewPolynom(A->gf, A->D + B->D);
GFE *SR=(GFE*)malloc(sizeof(GFE)*(B->D));
PolyMPY(&prodpoly, A, B, SR);
free(SR);
return prodpoly;
}
/*
int PolyMOD(Polynom* rx, const Polynom* a, const Polynom* b) {
//调用者需确保rx所需空间已正确地分配好
Using_Pow2Vec_Vec2Pow_NG(*(a->gf));
int k=a->D, r=b->D;
for (int i=0; b->coef[i]==0 && i<r+2; i++);
int r0=r-i;
if (r0<0) return -1;//表示除式为零
else if (r0==0) {rx->D=0; rx->coef[0]=0;}
//GFE* SR=(GFE*)malloc(sizeof(GFE)*r0);
GFE* SR=rx->coef;
GFE q;
for (i=0; i<r0; i++) SR[i]=a->coef[i];
for (i=0; i<k-r0+1; i++) {
q=GFDIV_V2V(SR[0], b->coef[r-r0], NG);
for (int j=0; j<r0-1; j++) SR[j]=SR[j+1]^GFMPY_V2V(b->coef[r-r0+1+j], q, NG);
SR[r0-1]=a->coef[r0+i]^GFMPY_V2V(b->coef[r], q, NG);
}
rx->D=r0-1;
return k-r0;//返回商式之次数
}
*/
Polynom PolyDIV(const Polynom* a, const Polynom* b) {
Using_Pow2Vec_Vec2Pow_NG(a->gf);
int k=a->D, r=b->D;
for (int i=0; b->coef[i]==0 && i<r+2; i++);
int r0=r-i;
if (r0<0) {
Polynom p;
p.D=-1;
return p;//表示除式为零
}
else if (r0==0) {
Polynom p=NewPolynom(a->gf, a->D);
for (i=0; i<=a->D; i++) p.coef[i]=a->coef[i];
return p;
}
GFE* SR=(GFE*)malloc(sizeof(GFE)*r0);
GFE* q=(GFE*)malloc(sizeof(GFE)*(k-r0+1));
for (i=0; i<r0; i++) SR[i]=a->coef[i];
for (i=0; i<k-r0+1; i++) {
q[i]=GFDIV_V2V(SR[0], b->coef[r-r0], NG);
for (int j=0; j<r0-1; j++) SR[j]=SR[j+1]^GFMPY_V2V(b->coef[r-r0+1+j], q[i], NG);
SR[r0-1]=a->coef[r0+i]^GFMPY_V2V(b->coef[r], q[i], NG);
}
Polynom p;
p.D=k-r0;
p.gf=a->gf;
p.coef=q;
return p;
}
int PolynomRoots(GFE *roots, const Polynom *f) {
/*
GFE *Pow2Vec=f->gf->Pow2Vec;
int *Vec2Pow=f->gf->Vec2Pow;
int NG=f->gf->N;
*/
Using_Pow2Vec_Vec2Pow_NG(f->gf);
GFE sum;
int rootexp, nr;
nr=0;
if (f->coef[0]==0) roots[nr++]=0;
for (int j=0; j<NG; j++) {
sum=0;
rootexp=j;
for (int k=0; k<=f->D; k++) {
if (f->coef[k]!=0) sum^=Pow2Vec[MODQ(rootexp+Vec2Pow[f->coef[k]] , NG)];
// _ASSERT(k>=0 && k<=2*t_RS);
rootexp+=j;
}
if (sum==0) {
roots[nr++]=Pow2Vec[j];
// _ASSERT(ierr-1<t_RS);
}
}
return nr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -