logo资料库

求多项式最大公因式程序实现.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
一.算法名称:求多项式最大公因式。 二.算法任务:求出两多项式的最大公因式,以及对应的 ( )u x 和 ( )v x 。 三.算法原理:运用欧几里得扩展算法。 四.算法描述: 输入:两整系数多项式 ,a b ;a 的次数大于等于b 的次数。(多项式的系数属于模素 数 p 的完全剩余类,即系数属于有限域 pF ) 输出: d  gcd( , ) a b 与 ,x y ,其中 xa yb d  ;  步骤:1. 若 0b  ,则 d    ,返回 ( , , a x d x y ; 1, 0 y ) , 1, x 1   0, y x 2. 初始化: 2 2 3. 当b > 0 时执行以下操作:   , a b r  3.1 q /  0, y 1  1 , a qb x   x 2 , qx y 1   y 2 qy 1 3.2 a   , b b , r x 2  , x x 1 1  , x y 2  , y y 1 1  y 4. d   , a x , x y 2 五.算法程序:  ,返回 ( , d x y 。 ) , y 2 #include #define p 7 int x2[101]={0},x1[101]={0},y2[101]={0},y1[101]={0},c[101]={0},q[101]={0}, r[101]={0},x[101]={0},y[101]={0}; int n1=0,n2=0; void qingkong(int a[]) { for(int i=0;i<=n1;i++) a[i]=0; } int cishu(int a[]) { for(int i=n1;i>=0;i--) if(a[i]!=0)
return i; return 0; } void chuandi(int a[],int b[]) { qingkong(b); for(int i=0;i<=cishu(a);i++) b[i]=a[i]%p; } int ni(int d) { for(int i=1;i=a2) { for(int i=a1,j=a2;i>=a1-a2;i--,j--) a[i]=(b[j]*ni(b[a2])*a[a1]-a[i])%p; c[a1-a2]=(ni(b[a2])*a[a1])%p;
a1=cishu(a); } } void cuili(int a[],int b[]) { while(cishu(b)>=0) { Mo(a,b);chuandi(c,q);Chen(q,b);jian(a,c);chuandi(c,r);qingkong(c); Chen(q,x1);jian(x2,c); chuandi(c,x);qingkong(c);Chen(q,y1);jian(y2,c);chuandi(c,y); chuandi(b,a);chuandi(r,b);chuandi(x1,x2);chuandi(x,x1); chuandi(y1,y2);chuandi(y,y1); } printf("最大公因式:"); for(int i=0;i<=cishu(a);i++) printf("%d ",a[i]); printf("\n"); printf("v(x)="); for(int j=0;j<=cishu(x2);j++) printf("%d ",x2[j]); printf("\n"); printf("u(x)="); for(int k=0;k<=cishu(y2);k++) printf("%d ",y2[k]); printf("\n"); } int main() { int a[101]={0},b[101]={0},i; x2[0]=1;y1[0]=1; printf("请输入高次多项式的次数:"); scanf("%d",&n1); printf("请输入此多项式的系数(按升幂排列):"); for(i=0;i<=n1;i++) scanf("%d",&a[i]); printf("请输入低次多项式的次数:"); scanf("%d",&n2); printf("请输入此多项式的系数(按升幂排列):"); for(i=0;i<=n2;i++) scanf("%d",&b[i]); mo(a,n1);mo(b,n2); if(n2==0) { printf("最大公因式:");
for(i=0;i<=n1;i++) printf("%d ",a[i]); printf("\n"); printf("v(x)=1\n"); printf("u(x)=0\n"); } else cuili(a,b); return 0; }
分享到:
收藏