亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? poly.cpp

?? 比較新的功能強大的rsa算法源代碼,方便使用.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
}

Poly pow(const Poly& f,const Big& k,const Poly& m)
{
    Poly u,t,u2,table[16];
    Big w,e;
    int i,j,nb,n,nbw,nzs;
    if (k==0) 
    {
        u.addterm((ZZn)1,0);
        return u;
    }
    u=f%m;
    if (k==1) return u;
    if (degree(m)>=FFT_BREAK_EVEN)
    { /* Uses FFT for fixed base - much faster for large m */
        setpolymod(m);

        u2=modmult(u,u,m);
        table[0]=u;
        for (i=1;i<16;i++)
            table[i]=modmult(u2,table[i-1],m);
        nb=bits(k);
        if (nb>1) for (i=nb-2;i>=0;)
        { 
            n=window(k,i,&nbw,&nzs,5);
            for (j=0;j<nbw;j++)
                u=modmult(u,u,m);
            if (n>0) u=modmult(u,table[n/2],m);
            i-=nbw;
            if (nzs)
            {
                for (j=0;j<nzs;j++) u=modmult(u,u,m);
                i-=nzs;  
            }
        }

        fft_reset();
    }
    else
    {
        e=k;
        w=pow((Big)2,bits(e)-1);
        e-=w; w/=2;
        while (w>0)
        {
            u=(u*u)%m;
            if (e>=w)
            {
               e-=w;
               u=(u*f)%m;
            }
            w/=2;
        }
    } 
    return u;
}

int degree(const Poly& p)
{
    if (p.start==NULL) return 0;
    else return p.start->n;
}


BOOL iszero(const Poly& p) 
{
    if (degree(p)==0 && p.coeff(0)==0) return TRUE;
    else return FALSE;
}

BOOL isone(const Poly& p)
{
    if (degree(p)==0 && p.coeff(0)==1) return TRUE;
    else return FALSE;
}

Poly factor(const Poly& f,int d)
{
    Poly c,u,h,g=f;
    Big r,p=get_modulus();
//    int lim=0;
    while (degree(g) > d)
    {
//       lim++;
//       if (lim>10) break;
// random monic polynomial
       u.clear();
       u.addterm((ZZn)1,2*d-1);
       for (int i=2*d-2;i>=0;i--)
       {
          r=rand(p);
          u.addterm((ZZn)r,i);
       }
       r=(pow(p,d)-1)/2;

       c=pow(u,r,g);
       c.addterm((ZZn)(-1),0);

       h=gcd(c,g);
       if (degree(h)==0 || degree(h)==degree(g)) continue;
       if (2*degree(h)>degree(g))
            g=g/h;
       else g=h;
    }
    return g;
}

void Poly::clear()
{
    term *ptr;
    while (start!=NULL)
    {   
       ptr=start->next;
       delete start;
       start=ptr;
    }
    
}

Poly& Poly::operator=(int m)
{
    clear();
    if (m!=0) addterm((ZZn)m,0);
    return *this;
}

Poly& Poly::operator=(const ZZn& m)
{
    clear();
    if (!m.iszero()) addterm(m,0);
    return *this;
}

Poly &Poly::operator=(const Poly& p)
{
    term *ptr,*pos=NULL;
    clear();
    ptr=p.start;
    while (ptr!=NULL)
    {  
        pos=addterm(ptr->an,ptr->n,pos);
        ptr=ptr->next;
    }    
    return *this;
}

Poly operator+(const Poly& a,const ZZn& z)
{
    Poly p=a;
    p.addterm(z,0);
    return p;
}

Poly operator-(const Poly& a,const ZZn& z)
{
    Poly p=a;
    p.addterm((-z),0);
    return p;
}


Poly operator+(const Poly& a,const Poly& b)
{
    Poly sum;
    sum=a;
    sum+=b;
    return sum;
}

Poly operator-(const Poly& a,const Poly& b)
{
    Poly sum;
    sum=a;
    sum-=b;
    return sum;
}

Poly& Poly::operator+=(const Poly& p)
{
    term *ptr,*pos=NULL;
    ptr=p.start;
    while (ptr!=NULL)
    {  
        pos=addterm(ptr->an,ptr->n,pos);
        ptr=ptr->next;
    }    
    return *this;
}

Poly& Poly::operator*=(const ZZn& x)
{
    term *ptr=start;
    while (ptr!=NULL)
    {
        ptr->an*=x;
        ptr=ptr->next;
    }
    return *this;
}

Poly operator*(const ZZn& z,const Poly &p)
{
    Poly r=p;
    r*=z;
    return r;
}

Poly operator*(const Poly &p,const ZZn& z)
{
    Poly r=p;
    r*=z;
    return r;
}

Poly operator/(const Poly& a,const ZZn& b)
{
    Poly quo;
    quo=a;
    quo/=(ZZn)b;
    return quo;
}

Poly& Poly::operator/=(const ZZn& x)
{
    ZZn t=(ZZn)1/x;
    term *ptr=start;
    while (ptr!=NULL)
    {
        ptr->an*=t;
        ptr=ptr->next;
    }
    return *this;
}

Poly& Poly::operator-=(const Poly& p)
{
    term *ptr,*pos=NULL;
    ptr=p.start;
    while (ptr!=NULL)
    {  
        pos=addterm(-(ptr->an),ptr->n,pos);
        ptr=ptr->next;
    }    
    return *this;
}
 
void Poly::multerm(const ZZn& a,int power)
{
    term *ptr=start;
    while (ptr!=NULL)
    {
        ptr->an*=a;
        ptr->n+=power;
        ptr=ptr->next;
    }
}

Poly invmodxn(const Poly& a,int n)
{ // Newton's method to find 1/a mod x^n
    int i,k;
    Poly b;
    k=0; while ((1<<k)<n) k++;
    b.addterm((ZZn)1/a.coeff(0),0); // important that a0 != 0
    for (i=1;i<=k;i++) b=modxn (2*b-a*b*b,1<<i);
    b=modxn(b,n);
    return b;
}

Poly modxn(const Poly& a,int n)
{ // reduce polynomial mod x^n
    Poly b;
    term* ptr=a.start;
    term *pos=NULL;
    while (ptr!=NULL && ptr->n>=n) ptr=ptr->next;
    while (ptr!=NULL)
    {
        pos=b.addterm(ptr->an,ptr->n,pos);
        ptr=ptr->next;
    }
    return b;
}

Poly divxn(const Poly& a,int n)
{ // divide polynomial by x^n
    Poly b;
    term *ptr=a.start;
    term *pos=NULL;
    while (ptr!=NULL)
    {
        if (ptr->n>=n)
            pos=b.addterm(ptr->an,ptr->n-n,pos);
        else break;
        ptr=ptr->next;
    }
    return b;
}

Poly mulxn(const Poly& a,int n)
{ // multiply polynomial by x^n
    Poly b;
    term *ptr=a.start;
    term *pos=NULL;
    while (ptr!=NULL)
    {
        pos=b.addterm(ptr->an,ptr->n+n,pos);
        ptr=ptr->next;
    }
    return b;
}

Poly reverse(const Poly& a)
{
    term *ptr=a.start;
    int deg=degree(a);
    Poly b;
    while (ptr!=NULL)
    {
        b.addterm(ptr->an,deg-ptr->n);
        ptr=ptr->next;
    } 
    return b;
}

// add term to polynomial. The pointer pos remembers the last
// accessed element - this is faster. 
// Polynomial is stored with large powers first, down to low powers
// e.g. 9x^6 + x^4 + 3x^2 + 1

term* Poly::addterm(const ZZn& a,int power,term *pos)
{
    term* newone;  
    term* ptr;
    term *t,*iptr;
    ptr=start;
    iptr=NULL;
    if (a.iszero()) return pos;
// quick scan through to detect if term exists already
// and to find insertion point
    if (pos!=NULL) ptr=pos;      // start looking from here
    while (ptr!=NULL) 
    { 
        if (ptr->n==power)
        {
            ptr->an+=a;
            if (ptr->an.iszero()) 
            { // delete term
                if (ptr==start)
                { // delete first one
                    start=ptr->next;
                    delete ptr;
                    return start;
                }
                iptr=ptr;
                ptr=start;
                while (ptr->next!=iptr)ptr=ptr->next;
                ptr->next=iptr->next;
                delete iptr;
                return ptr;
            }
            return ptr;
        }
        if (ptr->n>power) iptr=ptr;
        else break;
        ptr=ptr->next;
    }
    newone=new term;
    newone->next=NULL;
    newone->an=a;
    newone->n=power;
    pos=newone;
    if (start==NULL)
    {
        start=newone;
        return pos;
    }

// insert at the start

    if (iptr==NULL)
    { 
        t=start;
        start=newone;
        newone->next=t;
        return pos;
    }

// insert new term

    t=iptr->next;
    iptr->next=newone;
    newone->next=t;
    return pos;    
}

// A function to differentiate a polynomial
Poly differentiate(const Poly& orig)
{
    Poly newpoly;
    term *ptr = orig.start;
    term *pos = NULL;
    int power;

    while (ptr!=NULL)
    {   
        power = ptr->n;
        if(ptr->n > 0) 
            pos = newpoly.addterm(ptr->an*power,ptr->n-1,pos);
            
        ptr = ptr->next;
    }
    
    return newpoly;
}

void makemonic(Poly& p)
{
    term *ptr = p.start;
    p.multerm((ZZn)1/ptr->an,0);
}

// The extended euclidean algorithm
// The result is returned in an array of Polys, with the gcd
// in first place, then the two coefficients
void egcd(Poly result[], const Poly& u, const Poly& v)
{       
    Poly u1, u2, u3, v1, v2, v3, t1, t2, t3, zero, q;
    u1 = 1;  
    u2 = 0;
    u3 = u;
    v1 = 0;
    v2 = 1;
    v3 = v;
    zero = 0;
    term *ptr;
            
    while(v3 != zero) {
        q = u3/v3;
        t1 = u1 - v1*q;
        t2 = u2 - v2*q;
        t3 = u3 - v3*q;

        u1 = v1;
        u2 = v2;
        u3 = v3;

        v1 = t1;
        v2 = t2;
        v3 = t3;
    }
    result[0] = u3;
    result[1] = u1;
    result[2] = u2;

}

ostream& operator<<(ostream& s,const Poly& p)
{
    BOOL first=TRUE;
    ZZn a;
    term *ptr=p.start;
    if (ptr==NULL)
    { 
        s << "0";
        return s;
    }
    while (ptr!=NULL)
    {
        a=ptr->an;
        if ((Big)a<get_modulus()/2)
        {
            if (!first) s << " + ";
        }
        else 
        {
           a=(-a);
           s << " - ";
        }
        if (ptr->n==0) 
           s << (Big)a; 
        else 
        {
            if (a!=(ZZn)1)  s << (Big)a << "*x"; 
            else            s << "x";
            if (ptr->n!=1)  s << "^" << ptr->n;
        }
        first=FALSE;
        ptr=ptr->next;
    }
    return s;
} 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品一区二区蜜桃| 日韩一区二区三区电影在线观看 | 一区二区日韩av| 免费人成网站在线观看欧美高清| 国产精品996| 欧美日韩www| 亚洲美女视频在线| 国产一区二区影院| 91精品国产色综合久久不卡蜜臀| 国产精品三级在线观看| 日韩高清不卡一区二区| 91免费国产在线观看| 久久综合久久综合久久| 午夜日韩在线电影| 色狠狠av一区二区三区| 久久精品网站免费观看| 秋霞影院一区二区| 91黄色免费版| 国产精品超碰97尤物18| 国模无码大尺度一区二区三区| 欧美日韩精品是欧美日韩精品| 国产精品灌醉下药二区| 国产一区二区三区美女| 日韩欧美一级特黄在线播放| 一区二区在线免费观看| 99精品视频在线免费观看| 久久日一线二线三线suv| 日本成人在线视频网站| 欧美视频三区在线播放| 亚洲最新视频在线观看| 91免费观看在线| 亚洲欧美色综合| 成人国产精品免费网站| 国产精品网站在线观看| 国产成人精品aa毛片| 精品成a人在线观看| 久久99最新地址| 日韩你懂的电影在线观看| 日本视频一区二区三区| 日韩一区二区三区三四区视频在线观看 | 精品日韩在线观看| 久久激情五月婷婷| 7777精品伊人久久久大香线蕉最新版| 亚洲精品大片www| 日本高清不卡视频| 亚洲伦在线观看| 在线免费观看日本欧美| 亚洲夂夂婷婷色拍ww47| 欧美久久高跟鞋激| 日本vs亚洲vs韩国一区三区二区 | 五月天亚洲婷婷| 91 com成人网| 毛片av中文字幕一区二区| 精品理论电影在线观看| 国产乱子轮精品视频| 国产精品污网站| 在线观看欧美黄色| 秋霞电影一区二区| 久久综合五月天婷婷伊人| 高清视频一区二区| 一区二区三区四区乱视频| 欧美喷水一区二区| 国产在线精品一区二区夜色| 国产日本欧洲亚洲| 欧美在线制服丝袜| 裸体歌舞表演一区二区| 国产精品情趣视频| 欧美日韩激情一区二区三区| 精品一区二区三区日韩| 中文字幕一区不卡| 欧美伦理电影网| 高清不卡在线观看| 午夜精品一区在线观看| 久久久久88色偷偷免费| 欧美亚洲综合另类| 国产a区久久久| 亚洲国产日韩综合久久精品| 精品久久久久久久久久久久久久久| 国产高清视频一区| 偷拍与自拍一区| 国产精品每日更新| 日韩美女一区二区三区| 一本一本久久a久久精品综合麻豆| 日韩黄色片在线观看| 亚洲国产岛国毛片在线| 欧美精品在欧美一区二区少妇| 国产91精品一区二区麻豆网站| 亚洲成人资源在线| 国产精品日产欧美久久久久| 69堂成人精品免费视频| 色综合一区二区| 国产一区二区三区黄视频| 亚洲一区二区在线免费观看视频| 久久久久九九视频| 日韩欧美视频一区| 欧美三级在线看| 波多野结衣中文一区| 免费人成网站在线观看欧美高清| 欧美韩国日本综合| 日韩女优视频免费观看| 在线不卡欧美精品一区二区三区| 成人午夜av在线| 国内成+人亚洲+欧美+综合在线| 亚洲一区二区三区影院| 中日韩av电影| 久久久久久99久久久精品网站| 欧美一区二区三区在线视频| 欧美又粗又大又爽| 成人av集中营| 粉嫩一区二区三区在线看| 美女视频网站黄色亚洲| 午夜精品福利在线| 亚洲成在人线在线播放| 亚洲一区二区三区三| 一区二区三区av电影| 专区另类欧美日韩| 综合在线观看色| 1区2区3区欧美| 国产精品对白交换视频| 国产精品理伦片| 国产精品久久三| 国产精品久久久久久一区二区三区| 久久你懂得1024| 日本一区二区三区视频视频| 国产婷婷色一区二区三区| 久久综合九色综合欧美亚洲| 久久在线免费观看| 久久精子c满五个校花| 日本一区二区三区电影| 国产精品卡一卡二卡三| 亚洲精品中文字幕在线观看| 亚洲激情av在线| 午夜精品免费在线| 青青草精品视频| 韩国三级在线一区| 国产成人av电影免费在线观看| 高清久久久久久| 色综合 综合色| 欧美人xxxx| 久久综合久久鬼色| 亚洲欧美影音先锋| 亚洲综合色自拍一区| 午夜激情综合网| 国产精品一区二区在线观看网站| 国产不卡免费视频| 欧美优质美女网站| 日韩女优毛片在线| 国产精品久久久久久久久图文区| 亚洲黄色在线视频| 久久激情五月激情| 色综合久久综合网97色综合| 欧美女孩性生活视频| 久久夜色精品国产噜噜av| 国产精品免费视频观看| 亚洲成人你懂的| 国产自产视频一区二区三区| 91婷婷韩国欧美一区二区| 91精品国产综合久久福利| 中文字幕第一区第二区| 午夜精品久久一牛影视| 国产成人亚洲综合a∨婷婷图片| 91在线视频免费观看| 欧美一二三区在线观看| 中文字幕日韩精品一区| 蜜臀av一级做a爰片久久| av亚洲精华国产精华精华| 91麻豆精品国产自产在线观看一区| 国产亚洲视频系列| 日韩二区三区在线观看| www.成人在线| 精品黑人一区二区三区久久| 亚洲精品免费在线| 国产精品资源站在线| 欧美猛男男办公室激情| 亚洲欧美中日韩| 国产原创一区二区| 欧美蜜桃一区二区三区| 亚洲色图在线视频| 国产一区二区美女诱惑| 欧美狂野另类xxxxoooo| 亚洲日本va午夜在线影院| 国产一区二区女| 欧美一区二区视频在线观看| 一区二区成人在线观看| 波多野结衣视频一区| 国产午夜久久久久| 日韩高清在线不卡| 欧美日韩一卡二卡三卡| 18成人在线视频| 粉嫩aⅴ一区二区三区四区五区| 日韩欧美一区二区三区在线| 亚洲成a人v欧美综合天堂| 色综合激情久久| 亚洲视频网在线直播| 不卡的电影网站| 国产精品久久久久影院亚瑟| 国产成人a级片| 久久久久久久精| 国产91综合一区在线观看| 久久免费午夜影院|