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

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

?? poly.cpp

?? 比較新的功能強大的rsa算法源代碼,方便使用.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*
 * C++ class to implement a polynomial type and to allow 
 * arithmetic on polynomials whose elements are from
 * the finite field mod p
 *
 * WARNING: This class has been cobbled together for a specific use with
 * the MIRACL library. It is not complete, and may not work in other 
 * applications
 *
 * See Knuth The Art of Computer Programming Vol.2, Chapter 4.6 
 */

#include "poly.h"

#include <iostream>
using namespace std;

Poly::Poly(const ZZn& c,int p)
{
    start=NULL;
    addterm(c,p);
}

Poly::Poly(Variable &x)
{
    start=NULL;
    addterm((ZZn)1,1);
}

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

Poly operator*(const ZZn& c,Variable x)
{
    Poly t(c,1);
    return t;
}

Poly pow(Variable x,int n)
{
    Poly r((ZZn)1,n);
    return r;
}

BOOL operator==(const Poly& a,const Poly& b)
{
    Poly diff=a-b;
    if (iszero(diff)) return TRUE;
    return FALSE;
}

BOOL operator!=(const Poly& a,const Poly& b)
{
    Poly diff=a-b;
    if (iszero(diff)) return FALSE;
    return TRUE;
}

void setpolymod(const Poly& p) 
{ 
    int n,m;
    Poly h;
    term *ptr;
    big *f,*rf;
    n=degree(p);
    if (n<FFT_BREAK_EVEN) return;
    h=reverse(p);
    h=invmodxn(h,n);
    h=reverse(h);   // h=RECIP(f)
    m=degree(h);
    if (m<n-1) h=mulxn(h,n-1-m);

    f=(big *)mr_alloc(n+1,sizeof(big));
    rf=(big *)mr_alloc(n+1,sizeof(big));
 
    ptr=p.start;
    while (ptr!=NULL)
    {
       f[ptr->n]=getbig(ptr->an);
       ptr=ptr->next;
    }   
    ptr=h.start;
    while (ptr!=NULL)
    {
       rf[ptr->n]=getbig(ptr->an);
       ptr=ptr->next;
    }   
 
    mr_polymod_set(n,rf,f);

    mr_free(rf);
    mr_free(f);
}

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


Poly::~Poly()
{
   term *nx;
   while (start!=NULL)
   {   
       nx=start->next;
       delete start;
       start=nx;
   }
}

ZZn Poly::coeff(int power)  const
{
    ZZn c=0;
    term *ptr=start;
    while (ptr!=NULL)
    {
        if (ptr->n==power)
        {
            c=ptr->an;
            return c;
        }
        ptr=ptr->next;
    }
    return c;
}

ZZn Poly::F(const ZZn& x) const
{
    ZZn f=0;
    int diff;
    term *ptr=start;

// Horner's rule

    if (ptr==NULL) return f;
    f=ptr->an;

    while (ptr->next!=NULL)
    {
        diff=ptr->n-ptr->next->n;
        if (diff==1) f=f*x+ptr->next->an;
        else         f=f*pow(x,diff)+ptr->next->an;    
        ptr=ptr->next;
    }
    f*=pow(x,ptr->n);

    return f;
}

ZZn Poly:: min() const
{
    term *ptr=start;
    if (start==NULL) return (ZZn)0;
    
    while (ptr->next!=NULL) ptr=ptr->next;
    return (ptr->an);
}

Poly compose(const Poly& g,const Poly& b,const Poly& m)
{ // compose polynomials
  // assume G(x) = G3x^3 + G2x^2 + G1x^1 +G0
  // Calculate G(B(x) = G3.(B(x))^3 + G2.(B(x))^2 ....   
    Poly c,t;  
    term *ptr;
    int i,d=degree(g);
    Poly *table=new Poly[d+1];
    table[0].addterm((ZZn)1,0);
    for (i=1;i<=d;i++) table[i]=(table[i-1]*b)%m;
    ptr=g.start;
    while (ptr!=NULL)
    {
        c+=ptr->an*table[ptr->n];
        c=c%m;
        ptr=ptr->next;
    }
    delete [] table;
    return c;
}

Poly compose(const Poly& g,const Poly& b)
{ // compose polynomials
  // assume G(x) = G3x^3 + G2x^2 + G1x^1 +G0
  // Calculate G(B(x) = G3.(B(x))^3 + G2.(B(x))^2 ....   
    Poly c,t;  
    term *ptr;
    int i,d=degree(g);
    Poly *table=new Poly[d+1];
    table[0].addterm((ZZn)1,0);
    for (i=1;i<=d;i++) table[i]=(table[i-1]*b);
    ptr=g.start;
    while (ptr!=NULL)
    {
        c+=ptr->an*table[ptr->n];
        ptr=ptr->next;
    }
    delete [] table;
    return c;
}

Poly reduce(const Poly &x,const Poly &m)
{
    Poly r;
    int i,d;
    ZZn t;
    big *G,*R;
    term *ptr,*pos=NULL;
    int degm=degree(m);
    int n=degree(x);

    if (degm < FFT_BREAK_EVEN || n-degm < FFT_BREAK_EVEN)
    {
        r=x%m;
        return r;
    }
    G=(big *)mr_alloc(n+1,sizeof(big));
    char *memg=(char *)memalloc(n+1);
    for (i=0;i<=n;i++) G[i]=mirvar_mem(memg,i);
    R=(big *)mr_alloc(degm,sizeof(big));
    char *memr=(char *)memalloc(degm);
    for (i=0;i<degm;i++) R[i]=mirvar_mem(memr,i);

    ptr=x.start;
    while (ptr!=NULL)
    {
        copy(getbig(ptr->an),G[ptr->n]);
        ptr=ptr->next; 
    }
    if (!mr_poly_rem(n,G,R))
    {  // reset the modulus - things have changed
        setpolymod(m);
        mr_poly_rem(n,G,R);
    }
 
    r.clear();

    for (d=degm-1;d>=0;d--)
    {
        t=R[d];
        if (t.iszero()) continue;
        pos=r.addterm(t,d,pos);
    }
    memkill(memr,degm);

    mr_free(R);
    memkill(memg,n+1);
    mr_free(G);

    return r;
}

Poly modmult(const Poly &x,const Poly &y,const Poly &m)
{ /* x*y mod m */
    Poly r=x*y;
    r=reduce(r,m);
    return r;
}

Poly operator*(const Poly& a,const Poly& b)
{
    int i,d,dega,degb,deg;
    BOOL squaring;
    ZZn t;
    Poly prod;
    term *iptr,*pos;
    term *ptr=b.start;

    squaring=FALSE;
    if (&a==&b) squaring=TRUE;

    dega=degree(a);
    deg=dega;
    if (!squaring)
    {
        degb=degree(b);
        if (degb<dega) deg=degb;
    }
    else degb=dega;
    if (deg>=FFT_BREAK_EVEN)      /* deg is minimum - both must be less than FFT_BREAK_EVEN */
    { // use fast methods 
        big *A,*B,*C;
        deg=dega+degb;     // degree of product
   
        A=(big *)mr_alloc(dega+1,sizeof(big));
        if (!squaring) B=(big *)mr_alloc(degb+1,sizeof(big));        
        C=(big *)mr_alloc(deg+1,sizeof(big));
        char *memc=(char *)memalloc(deg+1);
        for (i=0;i<=deg;i++) C[i]=mirvar_mem(memc,i);
        ptr=a.start;
        while (ptr!=NULL)
        {
            A[ptr->n]=getbig(ptr->an);
            ptr=ptr->next;
        }

        if (!squaring)
        {
            ptr=b.start;
            while (ptr!=NULL)
            {
                B[ptr->n]=getbig(ptr->an);
                ptr=ptr->next;
            }
            mr_poly_mul(dega,A,degb,B,C);
        }
        else mr_poly_sqr(dega,A,C);
        pos=NULL;
        for (d=deg;d>=0;d--)
        {
            t=C[d];
            if (t.iszero()) continue;
            pos=prod.addterm(t,d,pos);
        }
        memkill(memc,deg+1);
        mr_free(C);
        mr_free(A);
        if (!squaring) mr_free(B);

        return prod;
    }

    if (squaring)
    { // squaring
        pos=NULL;
        while (ptr!=NULL)
        { // diagonal terms
            pos=prod.addterm(ptr->an*ptr->an,ptr->n+ptr->n,pos);
            ptr=ptr->next;
        }
        ptr=b.start;
        while (ptr!=NULL)
        { // above the diagonal
            iptr=ptr->next;
            pos=NULL;
            while (iptr!=NULL)
            {
                t=ptr->an*iptr->an;
                pos=prod.addterm(t+t,ptr->n+iptr->n,pos);
                iptr=iptr->next;
            }
            ptr=ptr->next; 
        }
    }
    else while (ptr!=NULL)
    {
        pos=NULL;
        iptr=a.start;
        while (iptr!=NULL)
        {
            pos=prod.addterm(ptr->an*iptr->an,ptr->n+iptr->n,pos);
            iptr=iptr->next;
        }
        ptr=ptr->next;
    }

    return prod;
}

Poly& Poly::operator%=(const Poly&v)
{
    ZZn m,pq;
    int power;
    term *rptr=start;
    term *vptr=v.start;
    term *ptr,*pos;
    if (degree(*this)<degree(v)) return *this;
    m=-((ZZn)1/vptr->an);
    while (rptr!=NULL && rptr->n>=vptr->n)
    {
        pq=rptr->an*m;
        power=rptr->n-vptr->n;
        pos=NULL;
        ptr=v.start;
        while (ptr!=NULL)
        {
            pos=addterm(ptr->an*pq,ptr->n+power,pos);
            ptr=ptr->next;
        } 
        rptr=start;
    }
    return *this;
}

Poly operator%(const Poly& u,const Poly&v)
{
    Poly r=u;
    r%=v;
    return r;
}

Poly operator/(const Poly& u,const Poly&v)
{
    Poly q,r=u;
    term *rptr=r.start;
    term *vptr=v.start;
    term *ptr,*pos;
    while (rptr!=NULL && rptr->n>=vptr->n)
    {
        Poly t=v;
        ZZn pq=rptr->an/vptr->an;
        int power=rptr->n-vptr->n;
  // quotient
        q.addterm(pq,power);
        t.multerm(-pq,power);
        ptr=t.start;
        pos=NULL;
        while (ptr!=NULL)
        {
            pos=r.addterm(ptr->an,ptr->n,pos);
            ptr=ptr->next;
        } 
        rptr=r.start;
    }
    return q;
}

Poly diff(const Poly& f)
{
   Poly d;
   term *pos=NULL;
   term *ptr=f.start;
   while (ptr!=NULL)
   {
       pos=d.addterm(ptr->an*ptr->n,ptr->n-1,pos);
       ptr=ptr->next;
   }

   return d;
}

Poly gcd(const Poly& f,const Poly& g)
{
    Poly a,b;
    a=f; b=g;
    term *ptr;
    forever
    {
        if (b.start==NULL)
        {
            ptr=a.start;
            a.multerm((ZZn)1/ptr->an,0);
            return a;
        }
        a%=b;
        if (a.start==NULL)
        {
            ptr=b.start;
            b.multerm((ZZn)1/ptr->an,0);
            return b;
        }
        b%=a;
    }
}

Poly pow(const Poly& f,int k)
{
    Poly u;
    int w,e,b;

    if (k==0)
    {
        u.addterm((ZZn)1,0);
        return u;
    }
    u=f;
    if (k==1) return u;

    e=k;
    b=0; while (k>1) {k>>=1; b++; }
    w=(1<<b);
    e-=w; w/=2;
    while (w>0)
    {
        u=(u*u);
        if (e>=w)
        {
           e-=w;
           u=(u*f);
        }
        w/=2; 
    }
    return u;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩高清不卡| 国产91在线|亚洲| 欧美午夜精品一区二区三区| 亚洲婷婷国产精品电影人久久| 成人网男人的天堂| 久久亚洲免费视频| 成人午夜av影视| 亚洲视频1区2区| 欧美日韩综合色| 日本免费新一区视频| 欧美日韩精品高清| 麻豆精品一区二区| 中文字幕不卡的av| 精品区一区二区| 国产不卡一区视频| 亚洲制服丝袜av| 精品久久久久久久久久久久久久久 | av爱爱亚洲一区| 亚洲激情一二三区| 日韩欧美自拍偷拍| 不卡电影免费在线播放一区| 亚洲已满18点击进入久久| 欧美图片一区二区三区| 久久超级碰视频| 亚洲日本免费电影| 日韩精品资源二区在线| 成人av资源下载| 日产国产欧美视频一区精品| 久久久综合视频| 在线亚洲一区二区| 精品一区二区免费在线观看| 一区二区中文视频| 91精品国产91久久久久久一区二区 | 精品人伦一区二区色婷婷| 99精品久久99久久久久| 五月婷婷色综合| 国产精品美女久久久久久2018| 国产一区二区三区高清播放| 一区二区三区日韩欧美精品| 在线成人午夜影院| av在线一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲综合色成人| 国产清纯在线一区二区www| 在线观看一区二区精品视频| 国产老妇另类xxxxx| 首页亚洲欧美制服丝腿| 亚洲欧洲美洲综合色网| 久久久噜噜噜久久人人看| 欧美精品v国产精品v日韩精品| 亚洲一区二区三区四区在线免费观看 | 青青草97国产精品免费观看无弹窗版| 色悠久久久久综合欧美99| 狠狠色丁香久久婷婷综合丁香| 精品人在线二区三区| 在线精品视频小说1| 成人福利视频在线看| 国产伦精品一区二区三区免费迷| 精品国产免费人成电影在线观看四季 | 欧美精品视频www在线观看| 成人性生交大片| 国产一区二区三区香蕉| 日韩国产欧美在线播放| 亚洲动漫第一页| 亚洲一区二区影院| 一区二区三区欧美日韩| 亚洲欧洲成人自拍| 国产精品国产自产拍在线| 国产精品你懂的| 国产精品人妖ts系列视频| 中文字幕精品三区| 国产精品人人做人人爽人人添| 在线国产亚洲欧美| 日本伦理一区二区| 91福利视频网站| 精品视频在线免费观看| 欧美日韩日日骚| 久久蜜臀精品av| 欧美一级黄色片| 精品捆绑美女sm三区| 2020日本不卡一区二区视频| 久久综合99re88久久爱| 精品欧美黑人一区二区三区| 久久亚洲精精品中文字幕早川悠里 | 日本一二三不卡| 中文字幕av免费专区久久| 国产精品午夜电影| 成人欧美一区二区三区黑人麻豆 | 欧美三区在线视频| 精品视频一区 二区 三区| 在线成人免费视频| 日韩天堂在线观看| 久久综合九色综合97_久久久| 色老头久久综合| 欧美亚洲动漫精品| 日韩一区二区精品在线观看| 日韩欧美成人午夜| 久久久www成人免费无遮挡大片| 6080午夜不卡| 久久天堂av综合合色蜜桃网| 国产精品日韩精品欧美在线| 亚洲在线中文字幕| 久久成人久久爱| 99精品桃花视频在线观看| 欧美日韩三级在线| 欧美精品一区二区三区视频 | 成人免费毛片嘿嘿连载视频| 国产a视频精品免费观看| 在线一区二区三区四区| 欧美精品视频www在线观看| 国产亚洲人成网站| 一区二区三区 在线观看视频| 一区二区中文字幕在线| 婷婷开心久久网| 国产成人免费视频| 欧美日韩一卡二卡三卡 | 9191久久久久久久久久久| 欧美午夜影院一区| 日韩精品一区二区三区视频播放| 欧美高清视频在线高清观看mv色露露十八| 国产91精品精华液一区二区三区| 蜜臀av一区二区三区| 成人激情开心网| 欧美酷刑日本凌虐凌虐| 日本一区二区三区久久久久久久久不| 欧美高清你懂得| 亚洲国产精品二十页| 日韩精品91亚洲二区在线观看| 亚洲免费av高清| 久久av资源站| 欧美午夜不卡在线观看免费| 久久老女人爱爱| 蜜臀av一区二区| 欧美日韩中文另类| 成人欧美一区二区三区小说| 奇米影视一区二区三区| 日本丶国产丶欧美色综合| 国产性色一区二区| 另类综合日韩欧美亚洲| 欧美曰成人黄网| 亚洲欧美激情在线| 粉嫩高潮美女一区二区三区| 精品日韩在线观看| 男人的天堂久久精品| 欧美又粗又大又爽| 中文字幕一区二区三区不卡 | 久久精品夜夜夜夜久久| 日韩精品电影一区亚洲| 色综合久久久久| 亚洲国产精品精华液2区45| 国产一区在线观看视频| 欧美xxxx老人做受| 奇米四色…亚洲| 欧美三级电影一区| 夜夜嗨av一区二区三区四季av| 日韩精品一级二级 | 久久99精品久久久| 欧美色精品天天在线观看视频| 91精品国产综合久久精品图片| 日韩免费观看2025年上映的电影| 欧美v国产在线一区二区三区| 久久久久国产精品免费免费搜索| 国产精品色婷婷| 成人福利视频在线| 国产精品免费av| 高清免费成人av| 国产校园另类小说区| 国产91精品精华液一区二区三区 | 欧美日韩一区精品| 亚洲最大成人网4388xx| 欧美三级韩国三级日本一级| 午夜电影一区二区| 欧美日韩成人综合天天影院 | 在线影视一区二区三区| 亚洲色图在线看| 91福利小视频| 亚洲国产一区在线观看| 欧美久久久影院| 日韩电影免费一区| 亚洲精品第1页| 欧美中文字幕一区二区三区亚洲| 欧美tickling挠脚心丨vk| 蜜桃精品在线观看| 国产亚洲欧美日韩在线一区| 国产成人a级片| 亚洲男人的天堂av| 欧美日韩精品欧美日韩精品| 青青青伊人色综合久久| 国产午夜精品久久久久久免费视 | 亚洲成人黄色影院| 制服丝袜亚洲播放| 国产在线精品国自产拍免费| 国产精品区一区二区三| 欧洲精品在线观看| 麻豆国产欧美日韩综合精品二区 | 欧美高清激情brazzers| 麻豆91在线观看| 久久久久久97三级| 在线观看日韩毛片| 九九**精品视频免费播放|