有限域的多項式乘法逆元求解

來源:互聯網
上載者:User

題目:

求解演算法,擴充的歐幾裡得演算法

/*@author tilltheendwjx@blog http://blog.csdn.net/wjh200821或者http://www.cnblogs.com/tilltheendwjx/ */ #include<iostream>using namespace std;int indexofmax1(int value){    int tmp=1;    int count=0;    for(int i=0;i<sizeof(int)*8;++i)    {          if((value&tmp))             count=i;          tmp=tmp*2;    }    return count;}void polynomialtostring(int value){    int tmp=1;    int flag=0;    int c=indexofmax1(value);    for(int i=0;i<sizeof(int)*8;++i)    {          if((value&tmp))          {             if(i==0)             {               cout<<"1";             }else if(i==1)             {               cout<<"x";             }else             {               cout<<"x^"<<i;             }             flag=1;             if(i<c)               cout<<"+";          }             tmp=tmp*2;    }    if(flag==0)      cout<<"0";}int powofvalue(int value){    return 1<<(value);}int divide(int m,int b,int &remainvalue){    int mindex=indexofmax1(m);    int vindex=indexofmax1(b);    if(mindex<vindex)    {        remainvalue=m;        return 0;    }    int c=mindex-vindex;    int tmp=b;    tmp=tmp<<c;    m=m^tmp;    return powofvalue(c)|divide(m,b,remainvalue);}int Tx(int ax,int q,int bx){    //cout<<endl;    //cout<<ax<<"\t"<<bx<<"\t";    int tmp=1;    int value=0;    for(int i=0;i<sizeof(int)*8;++i)    {          if((q&tmp))          {             value=value^((bx<<i));             }             tmp=tmp*2;    }    //cout<<ax<<"\t"<<value<<"\t";    //cout<<endl;    return ax^(value);}int extent_gcd(int m,int b,int &x,int &y){   int a1=1,a2=0,a3=m;   int b1=0,b2=1,b3=b;   int remainvalue=0;   while(1)   {           polynomialtostring(a1);           cout<<"    ";           polynomialtostring(a2);           cout<<"    ";           polynomialtostring(a3);           cout<<"    ";           polynomialtostring(b1);           cout<<"    ";           polynomialtostring(b2);           cout<<"    ";           polynomialtostring(b3);           cout<<"    ";          if(b3==0)              return a3;          if(b3==1)               return b3;          int q=divide(a3,b3,remainvalue);          int t1=Tx(a1,q,b1);          int t2=Tx(a2,q,b2);          int t3=remainvalue;          cout<<t1<<endl;          cout<<t2<<endl;          a1=b1;a2=b2;a3=b3;          b1=t1;b2=t2;b3=t3;          x=b2;y=b3;          polynomialtostring(q);          cout<<endl;   } }int main(void){int m=283,b=83,x=0,y=0;cout<<"中間結果如下:"<<endl; cout<<"a1   a2    a3    b1    b2    b3    q"<<endl;int reault=extent_gcd(m,b,x,y);cout<<endl;cout<<"多項式(";polynomialtostring(b);cout<<")mod(";polynomialtostring(m);cout<<")的乘法逆元是(";polynomialtostring(x);cout<<")"<<endl;system("pause"); return 0;}

運行結果如

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.