多項式運算封裝

2022-09-20 14:39:12 字數 3087 閱讀 3882

update on 21.12.30:新增了polyeva;修補了polymod處多測時可能產生的 bug。

update on 22.2.7:重 寫(前一版太醜了),改為完全封裝版本(使用std::vector存放多項式係數,運算在命名空間polynomial::裡)

實現的並不優秀,但應該很穩(霧)。全部提交測試過,部分由vincra這個賬號提交。

ver 1

變數/常量:

n:多項式次數。

djq g invg:模數、該模數的乙個原根、該原根的逆元。

ar1~ar5:不知道起什麼名字的輔助陣列。

ivg~img:看名字大概能猜出來什麼用的輔助陣列。

rev1 rev2:蝴蝶變換陣列。

函式(pulic):

若無特殊說明,整數、多項式係數均為 \(\pmod \) 意義下。

ksm(a,b):求 \(a^b\);快速冪;\(o(\log b)\)。

modsqrt(a):求 \(a^}\);原根 + bsgs;\(o(\sqrt )\)。

initrev(n,lgn,l,rev):預處理\(\pmod\) 意義下 ntt 所用的蝴蝶變換陣列;暴力;\(o(n)\)。

ntt(a,n,opt,rev):以 \(rev\) 作為蝴蝶變換陣列,對 \(a(x)\pmod\) 做快速數論變換(\(n^\) 放在外面乘);ntt;\(o(n\log n)\)。

polymul(a,b,c,n):求 \(c(x)=a(x)b(x)\pmod}\);ntt;\(o(n\log n)\)。

polyinv(a,b,n):求 \(b(x)=a^(x)\pmod\);牛頓迭代 + ntt;\(o(n\log n)\)。

polydif(a,b,n):求 \(b(x)=\dfraca(x)}x}\pmod\);微分;\(o(n)\)。

polyint(a,b,n):求 \(b(x)=\int a(x)\mathrmx\pmod\);積分;\(o(n)\)。

polysqrt(a,b,n):求 \(b(x)=a^}(x)\pmod\)(對\(a_0\) 無要求);牛頓迭代 + ntt;\(o(n\log n)\)。

polyln(a,b,n):求 \(b(x)=\ln a(x)\pmod\)(由麥克勞林級數定義);復合函式微分 + 積分 + ntt;\(o(n\log n)\)。

polyexp(a,b,n):求 \(b(x)=\exp a(x)\pmod\)(由麥克勞林級數定義);牛頓迭代 +polyln;\(o(n\log n)\)。

polymod(a,b,c,n,m,d):有 \(a(x)\pmod\) 和 \(b(x)\pmod\) (\(m),求 \(d(x)=a(x)\bmod\pmod}\),\(c(x)=b^(x)(a(x)-d(x))\pmod}\);暴力 +polyinv;\(o(n\log n)\)

polyksm(a,b,k,n):求 \(b(x)=a^k(x)\pmod\)(要求 \(a_0=1\));初中數學 +polyln+polyexp;\(o(n\log n)\)。

sppolyksm(a,b,k1,k2,lim,n):求 \(b(x)=a^k(x)\pmod\)(對\(a_0\) 無要求),其中 \(k1=k\pmod\) , \(k1=k\pmod\) , \(lim=\min(k,p)\)(用於特判);暴力 +polyksm;\(o(n\log n)\)。

polyeva(a,b,n,m):給出 \(a(x)\pmod\) 和 \(x_1\ldots x_m\),輸出 \(a(x_1)\ldots a(x_m)\)。(多點快速求值)

const int n=100005,djq=998244353;

class poly

void cdq(ll* f,ll* g,int l,int r)

ll *p[4*n]; int len[4*n];

void up(int x)

void solve(int x,int l,int r,ll* a)

public:

inline int ksm(ll base,int p) return ret;

}inline int modsqrt(int x)

inline void initrev(const int n,int& lgn,int& l,int* rev)

void ntt(ll* a,const int l,const int opt,int* rev)

void polycdq(ll* a,ll* b,const int n,const int va)

void polyeva(ll* a,ll* x,const int n,const int m)

}work;

ver 2(施工中)
const int djq=998244353;

inline int ksm(int base,int p)

return ret;

}namespace polynomial

inline int modsqrt(int x)

inline int initrev(const int n)

inline void ntt(poly &a,const int len,const int opt)

poly qpow(poly a,const int k,const int n)

}

多項式運算

多項式運算 順序棧實現 在demo1.cpp基礎上增加 彌補異常處理 以及多位數運算缺點 include include include define ok 1 define error 2 define overflow 1 define ini size 100 typedef int elem...

VC多項式運算

多項式運算主要是係數和指數的處理,本文用乙個簡單的例子實現該功能。首先,新建控制台應用程式 然後,新建類 標頭檔案 polynomial.h inte ce for the cpolynomial class.if defined afx polynomial h 06b9bccd 1789 483...

2 10多項式及其運算

1 多項式的表達與建立 matlab約定n次多項式用乙個長度為n 1的係數行向量來表示,按降冪排列,缺少的冪次項係數為0.2 多項式的運算 多項式的運算由四則運算符和運算函式組成,主要如下 1 多項式加減運算,維數必須相同 2 多項式乘運算 利用函式c conv a,b 3 多項式除運算 利用函式 ...