多项式总结(unfinished)
试试以二级标题为主的格式。
多项式相关
注:本篇博客不包含\(FFT\)基础姿势。如果您想要阅读本篇博客,请确保自己对\(FFT,NTT\)有基本的认识并且能够独立写出代码。
多项式是什么?
左转数学七年级上册课本。
多项式的两种表示法
系数表示法和点值表示法,过于基础不多解释。
多项式的四则运算及扩展
多项式加减法
同类项直接进行加减即可,过于简单不多解释。
多项式乘法
朴素算法:\(O(n^2)\)。
分治乘法:没写过,不常用,不知道。
快速傅里叶变换(\(FFT\)):\(O(nlogn)\)。
快速数论变换(\(NTT\)):\(O(nlogn)\)。
(一般认为\(NTT\)的常数比\(FFT\)大,两者的适用情况略有不同。)
多项式求逆
给定一个多项式\(F(x)\),请求出一个多项式\(G(x)\),满足\(F(x) \times G(x) \equiv 1\ (mod\ x^n)\)。系数对\(998244353\)取模。
推倒过程
显然\(n=1\)时,直接算乘法逆元即可。
假设我们已经求出了\(H(x)\)满足\(F(x) \times H(x) \equiv 1\ (mod\ x^{\lceil \frac{n}{2} \rceil})\),我们现在想求出\(G(x)\)满足\(F(x) \times G(x) \equiv 1\ (mod\ x^n)\)。
显然有\(F(x) \times G(x) \equiv 1\ (mod\ x^{\lceil \frac{n}{2} \rceil})\)成立,所以我们可以得到\(G(x)-H(x) \equiv 0\ (mod\ x^{\lceil \frac{n}{2} \rceil})\)。
同余号两边同时平方,并且我们发现模数也可以平方,得:
\]
\]
同余号两边同时乘\(F(x)\),得:
\]
\]
从上面的推倒过程我们可以发现,想要求出\(G(x)\),要先求出\(H(x)\)。求出\(H(x)\)相当于是这个问题的一个规模缩小的子问题,于是我们可以考虑递归求解。
时间复杂度:\(O(nlogn)\)。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
}
const int MAXN=100005;
const int MAXLEN=270005;
const LL MOD=998244353;
const LL G=3;
const LL INVG=332748118;
int n,m;
int a[MAXLEN];
int len,rev[MAXLEN];
LL invn,A[MAXLEN],B[MAXLEN];
inline LL qpow(LL x,LL y){
LL ret=1,tt=x%MOD;
while(y){
if(y&1) ret=ret*tt%MOD;
tt=tt*tt%MOD;
y>>=1;
}
return ret;
}
inline void ntt(LL *c,int dft){
rin(i,0,n-1) if(i<rev[i])
std::swap(c[i],c[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
int r=(mid<<1);
LL u=qpow(dft>0?G:INVG,(MOD-1)/r);
for(int l=0;l<n;l+=r){
LL v=1;
for(int i=0;i<mid;i++,v=v*u%MOD){
LL x=c[l+i],y=c[l+mid+i]*v%MOD;
c[l+i]=x+y;
if(c[l+i]>=MOD) c[l+i]-=MOD;
c[l+mid+i]=x-y;
if(c[l+mid+i]<0) c[l+mid+i]+=MOD;
}
}
}
if(dft<0) rin(i,0,n-1)
c[i]=c[i]*invn%MOD;
}
void solve(int Floor){
if(Floor==1){
B[0]=qpow(a[0],MOD-2);
return;
}
solve((Floor+1)>>1);
m=Floor-1+((((Floor+1)>>1)-1)<<1);
len=0;
for(n=1;n<=m;n<<=1) len++;
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
rin(i,0,n-1) A[i]=(i<Floor?a[i]:0);
invn=qpow(n,MOD-2);
ntt(A,1);
ntt(B,1);
rin(i,0,n-1) B[i]=((2*B[i]-A[i]*B[i]%MOD*B[i])%MOD+MOD)%MOD;
ntt(B,-1);
rin(i,Floor,n-1) B[i]=0;
}
int main(){
n=read();
n--;
rin(i,0,n){
a[i]=read();
}
int nn=n;
solve(n+1);
rin(i,0,nn){
printf("%lld ",B[i]);
}
printf("\n");
return 0;
}
多项式除法/多项式取模
给定一个\(n\)次多项式\(F(x)\)和一个\(m\)次多项式\(G(x)\),请求出多项式\(Q(x),R(x)\),满足以下条件:
\(Q(x)\)次数为\(n−m\),\(R(x)\)次数小于\(m\)。
\(F(x)=Q(x) \times G(x)+R(x)\)。
所有的运算在模\(998244353\)意义下进行。
推倒过程
首先我们要知道对于任意一个\(n\)次多项式\(f(x)\),将其系数翻转后得到的多项式为\(f_R(x)=x^nf(\frac{1}{x})\)。
回到题目,将等式中的所有多项式的自变量改为\(\frac{1}{x}\),等号左右同时乘\(x\),得:
\]
\]
\]
\]
利用多项式求逆可以求出\(Q_R(x)\),然后根据:
\]
可以求出\(R(x)\)。
时间复杂度:\(O(nlogn)\)。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
}
const int MAXN=100005;
const int MAXLEN=270005;
const LL MOD=998244353;
const LL ROOT=3;
const LL INVROOT=332748118;
int n,m;
int len,rev[MAXLEN];
int F[MAXN],G[MAXN];
LL Q[MAXN],R[MAXN];
LL invn;
LL A[MAXLEN],B[MAXLEN];
inline LL qpow(LL x,LL y){
LL ret=1,tt=x%MOD;
while(y){
if(y&1) ret=ret*tt%MOD;
tt=tt*tt%MOD;
y>>=1;
}
return ret;
}
inline void ntt(LL *c,int dft){
rin(i,0,n-1) if(i<rev[i])
std::swap(c[i],c[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
int r=(mid<<1);
LL u=qpow(dft>0?ROOT:INVROOT,(MOD-1)/r);
for(int l=0;l<n;l+=r){
LL v=1;
for(int i=0;i<mid;i++,v=v*u%MOD){
LL x=c[l+i],y=c[l+mid+i]*v%MOD;
c[l+i]=x+y;
if(c[l+i]>=MOD) c[l+i]-=MOD;
c[l+mid+i]=x-y;
if(c[l+mid+i]<0) c[l+mid+i]+=MOD;
}
}
}
if(dft<0) rin(i,0,n-1)
c[i]=c[i]*invn%MOD;
}
void getinv(int Floor){
if(Floor==1){
B[0]=qpow(G[0],MOD-2);
return;
}
getinv((Floor+1)>>1);
m=Floor-1+((((Floor+1)>>1)-1)<<1);
len=0;
for(n=1;n<=m;n<<=1) len++;
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
rin(i,0,n-1) A[i]=(i<Floor?G[i]:0);
invn=qpow(n,MOD-2);
ntt(A,1);
ntt(B,1);
rin(i,0,n-1) B[i]=((2*B[i]-A[i]*B[i]%MOD*B[i])%MOD+MOD)%MOD;
ntt(B,-1);
rin(i,Floor,n-1) B[i]=0;
}
int main(){
n=read(),m=read();
rin(i,0,n) F[i]=read();
rin(i,0,m) G[i]=read();
std::reverse(F,F+n+1);
std::reverse(G,G+m+1);
int nn=n,mm=m;
getinv(n-m+1);
//求Q
n=nn,m=mm;
memset(A,0,sizeof A);
rin(i,0,n) A[i]=F[i];
m=n+n-m;
len=0;
for(n=1;n<=m;n<<=1) len++;
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
invn=qpow(n,MOD-2);
ntt(A,1);
ntt(B,1);
rin(i,0,n-1) A[i]=A[i]*B[i]%MOD;
ntt(A,-1);
n=nn,m=mm;
rin(i,0,n-m) Q[i]=A[i];
//求R
std::reverse(F,F+n+1);
std::reverse(G,G+m+1);
std::reverse(Q,Q+n-m+1);
memset(A,0,sizeof A);
memset(B,0,sizeof B);
rin(i,0,n-m) A[i]=Q[i];
rin(i,0,m) B[i]=G[i];
m=n;
len=0;
for(n=1;n<=m;n<<=1) len++;
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
invn=qpow(n,MOD-2);
ntt(A,1);
ntt(B,1);
rin(i,0,n-1) A[i]=A[i]*B[i]%MOD;
ntt(A,-1);
rin(i,0,m-1) R[i]=(F[i]-A[i]+MOD)%MOD;
n=nn,m=mm;
rin(i,0,n-m) printf("%lld ",Q[i]);
printf("\n");
rin(i,0,m-1) printf("%lld ",R[i]);
printf("\n");
return 0;
}
多项式开方
关于这一部分博主还不能很透彻地理解,所以先放出简要推倒过程。在给出多项式的常数项不为\(0\)或\(1\)时,求开方后多项式的常数项时需要用到二次剩余。但是由于博主目前仍未学习二次剩余(太菜了),所以只能给出给出多项式的常数项为\(0\)或\(1\)时的代码,不久之后会完善这一部分。
对于一个多项式\(A(x)\),如果存在一个多项式\(B(x)\),满足\(B(x)^2 \equiv A(x)\ (mod\ x^n)\),则称\(B(x)\)为\(A(x)\)在\(mod\ x^n\)下的平方根。
所有的运算在模\(998244353\)意义下进行。
推倒过程
\(B(x)\)的常数项可以由\(A(x)\)的常数项二次剩余求出。特别的,当\(A(x)\)的常数项为\(0\)或\(1\)时,\(B(x)\)的常数项与\(A(x)\)相等。
类似多项式求逆,假设我们已经求出了\(C(x)^2 \equiv A(x)\ (mod\ x^{\lceil \frac{n}{2} \rceil})\),现在我们想要求\(B(x)^2 \equiv A(x)\ (mod\ x^n)\)。
显然\(B(x)^2 \equiv A(x)\ (mod\ x^{\lceil \frac{n}{2} \rceil})\)。
所以有\(B(x)^2-C(x)^2 \equiv 0\ (mod\ x^{\lceil \frac{n}{2} \rceil})\)。
两边同时平方,得:
\]
\]
\]
\]
\]
然后多项式求逆即可。
时间复杂度:\(O(nlogn)\)。
Update on 2018/12/13:一段更靠谱的证明:
\]
\]
\]
\]
\]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
}
const int MAXN=100005;
const int MAXLEN=270005;
const LL MOD=998244353;
const LL ROOT=3;
const LL INVROOT=332748118;
const LL INV2=499122177;
int n,m;
int len,rev[MAXLEN];
int a[MAXN];
LL invn,A[MAXLEN],B[MAXLEN],C[MAXLEN];
inline LL qpow(LL x,LL y){
LL ret=1,tt=x%MOD;
while(y){
if(y&1) ret=ret*tt%MOD;
tt=tt*tt%MOD;
y>>=1;
}
return ret;
}
inline void ntt(LL *c,int dft){
rin(i,0,n-1) if(i<rev[i])
std::swap(c[i],c[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
int r=(mid<<1);
LL u=qpow(dft>0?ROOT:INVROOT,(MOD-1)/r);
for(int l=0;l<n;l+=r){
LL v=1;
for(int i=0;i<mid;i++,v=v*u%MOD){
LL x=c[l+i],y=c[l+mid+i]*v%MOD;
c[l+i]=x+y;
if(c[l+i]>=MOD) c[l+i]-=MOD;
c[l+mid+i]=x-y;
if(c[l+mid+i]<0) c[l+mid+i]+=MOD;
}
}
}
if(dft<0) rin(i,0,n-1)
c[i]=c[i]*invn%MOD;
}
void getinv(int Floor){
if(Floor==1){
C[0]=qpow(B[0],MOD-2);
return;
}
getinv((Floor+1)>>1);
m=Floor-1+((((Floor+1)>>1)-1)<<1);
len=0;
for(n=1;n<=m;n<<=1) len++;
invn=qpow(n,MOD-2);
rin(i,0,n-1) A[i]=(i<Floor?B[i]:0);
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
ntt(A,1);
ntt(C,1);
rin(i,0,n-1) C[i]=(((2*C[i]-A[i]*C[i]%MOD*C[i])%MOD)+MOD)%MOD;
ntt(C,-1);
rin(i,Floor,n-1) C[i]=0;
}
void solve(int Floor){
if(Floor==1){
B[0]=a[0];
return;
}
solve((Floor+1)>>1);
getinv(Floor);
m=Floor-1+((((Floor+1)>>1)-1)<<1);
len=0;
for(n=1;n<=m;n<<=1) len++;
invn=qpow(n,MOD-2);
rin(i,0,n-1) A[i]=(i<Floor?a[i]:0);
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
// ntt(A,1);
// ntt(B,1);
// ntt(C,1);
// rin(i,0,n-1) B[i]=(A[i]+B[i]*B[i])%MOD*C[i]%MOD*INV2%MOD;
// ntt(B,-1);
ntt(A,1);
ntt(C,1);
rin(i,0,n-1) A[i]=A[i]*C[i]%MOD;
ntt(A,-1);
rin(i,0,Floor-1) B[i]=(A[i]+B[i])*INV2%MOD;
rin(i,Floor,n-1) B[i]=0;
rin(i,0,n-1) C[i]=0;
}
int main(){
n=read();
n--;
rin(i,0,n) a[i]=read();
int nn=n;
solve(n+1);
rin(i,0,nn) printf("%lld ",B[i]);
printf("\n");
return 0;
}
拉格朗日插值
由初中知识可知,\(n\)个点\((x_i,y_i)\)可以唯一地确定一个多项式。
现在,给定\(n\)个点,请你确定这个多项式,并将\(k\)代入求值,无需输出多项式每项的系数。
求出的值对\(998244353\)取模。
推倒过程
令\(f(x)=\sum_{i=1}^{n}y_il_i(x)\),\(l_i(x)=\prod_{j=1,j \neq i}^{n}\frac{x-x_j}{x_i-x_j}\)。
容易发现\(l_i(x_i)=1\),\(l_i(x_j)=0\ (j \neq i)\)。
显然\(f(x)\)过所有\(n\)个点,\(f(x)\)为所求多项式,求出\(f(k)\)即可。
时间复杂度:\(O(n^2)\)。
Update on 2019/2/14:如果点值连续或等差,时间复杂度可以优化到\(O(n)\)。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
}
const int MAXN=100005;
const LL MOD=998244353;
int n;
LL k,X[MAXN],Y[MAXN];
inline LL qpow(LL x,LL y){
LL ret=1,tt=x%MOD;
while(y){
if(y&1) ret=ret*tt%MOD;
tt=tt*tt%MOD;
y>>=1;
}
return ret;
}
int main(){
n=read(),k=read();
rin(i,1,n){
X[i]=read();
Y[i]=read();
}
LL ans=0;
rin(i,1,n){
LL son=1,mot=1;
rin(j,1,n){
if(i==j) continue;
son=son*(k-X[j]+MOD)%MOD;
mot=mot*(X[i]-X[j]+MOD)%MOD;
}
ans=(ans+Y[i]*son%MOD*qpow(mot,MOD-2))%MOD;
}
printf("%lld\n",ans);
return 0;
}
所有给出点的横坐标是连续的话,还可以做到\(O(n)\)求解。但是博主太菜了,你们懂的。
任意模数\(NTT\)
三模数\(NTT\)
由于两个多项式卷积后每项系数的大小是\(O(na_i^2)\)级别的,所以我们只需选取两到三个大小合适的可以进行\(NTT\)的素数分别\(NTT\)后\(CRT\)合并答案即可,可能需要用到快速乘防止爆\(long\ long\)。
需要做\(9\)遍\(NTT\),常数巨大。
拆系数\(FFT\)
我们可以把给出的多项式系数\(a_i\)写成\(a_i=p_i \times 32768+q_i\)。同理\(b_i=r_i \times 32768+s_i\)。
那么就有:
\]
整理,得:
\]
这样只需要做\(4\)遍\(DFT\)和\(3\)遍\(IDFT\)了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
}
const int MAXN=100005;
const int MAXLEN=270005;
const long double pi=std::acos(-1);
int n,m;LL MOD;
int len,rev[MAXLEN];
int a[MAXN],b[MAXN];
struct Complex{
long double real,imag;
inline friend Complex operator + (Complex x,Complex y){
return (Complex){x.real+y.real,x.imag+y.imag};
}
inline friend Complex operator - (Complex x,Complex y){
return (Complex){x.real-y.real,x.imag-y.imag};
}
inline friend Complex operator * (Complex x,Complex y){
return (Complex){x.real*y.real-x.imag*y.imag,x.real*y.imag+x.imag*y.real};
}
};
Complex A[MAXLEN],B[MAXLEN],C[MAXLEN],D[MAXLEN],E[MAXLEN];
inline void fft(Complex *c,int dft){
rin(i,0,n-1) if(i<rev[i])
std::swap(c[i],c[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
int r=(mid<<1);
Complex u=(Complex){std::cos(pi/mid),dft*std::sin(pi/mid)};
for(int l=0;l<n;l+=r){
Complex v=(Complex){1,0};
for(int i=0;i<mid;i++,v=v*u){
Complex x=c[l+i],y=c[l+mid+i]*v;
c[l+i]=x+y;
c[l+mid+i]=x-y;
}
}
}
if(dft<0) rin(i,0,n-1)
c[i].real/=n;
}
int main(){
n=read(),m=read(),MOD=read();
rin(i,0,n){
a[i]=read();
A[i].real=(a[i]>>15);
B[i].real=(a[i]&32767);
}
rin(i,0,m){
b[i]=read();
C[i].real=(b[i]>>15);
D[i].real=(b[i]&32767);
}
int nn=n,mm=m;
m+=n;
for(n=1;n<=m;n<<=1) len++;
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
fft(A,1);
fft(B,1);
fft(C,1);
fft(D,1);
rin(i,0,n-1){
E[i]=A[i]*D[i]+B[i]*C[i];
A[i]=A[i]*C[i];
B[i]=B[i]*D[i];
}
fft(A,-1);
fft(B,-1);
fft(E,-1);
n=nn,m=mm;
rin(i,0,n+m) printf("%lld ",((((LL)(A[i].real+0.5)%MOD)<<30)%MOD+(((LL)(E[i].real+0.5)%MOD)<<15)%MOD+(LL)(B[i].real+0.5))%MOD);
printf("\n");
return 0;
}
拆系数\(FFT\)(\(4\)遍\(DFT\))
利用\(FFT\)的虚部空间可以实现一遍\(DFT\)对两个多项式进行求值,一遍\(IDFT\)对两组点值进行插值。
只需做\(2\)遍\(DFT\)和\(2\)遍\(IDFT\)即可完成,代码另外放出。
之后要补充的东西
牛顿迭代法
多项式多点求值
多项式指数,对数函数
*多项式快速插值
update on 2019.3.23:填了一些坑,看这里。
参考博客
多项式总结(unfinished)的更多相关文章
- NOIP2009多项式输出(水)【A004】
[A004]潜伏者[难度A]—————————————————————————————————————————————————————————————————————————— [题目要求] 一元 n ...
- 两个多项式相加 ( C++ )
实现两个多项式进行相加 不开辟空间 ( 这要求实现进行相加,代价为两个原链表将被修改) 分析: this>other 就把other当前结点放置在this之前 this<other 就th ...
- 程序设计入门——C语言 第7周编程练习 1多项式加法(5分)
第7周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...
- 用clock()函数计算多项式的运行时间
百度百科中定义clock():clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; 简 ...
- project 2016 11 20 树的多项式
#include <iostream>#include <stack>#include <cmath>#include <sstream> using ...
- AC日记——计算多项式的导函数 openjudge 1.5 38
38:计算多项式的导函数 总时间限制: 1000ms 内存限制: 65536kB 描述 计算多项式的导函数是一件非常容易的任务.给定一个函数f(x),我们用f'(x)来表示其导函数.我们用x^n来 ...
- UOJ34 多项式乘法
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- TYVJ P1103 多项式输出 Label:模拟 有点儿坑
描述 一元 n 次多项式可用如下的表达式表示: f(x)=an*x^n+an-1*x^n-1+...+a1*x+a0,an<>0其中,ai*a^x 称为i次项,ai称为i次项的系数.给出 ...
- PRML读书会第二章 Probability Distributions(贝塔-二项式、狄利克雷-多项式共轭、高斯分布、指数族等)
主讲人 网络上的尼采 (新浪微博: @Nietzsche_复杂网络机器学习) 网络上的尼采(813394698) 9:11:56 开始吧,先不要发言了,先讲PRML第二章Probability Dis ...
随机推荐
- 七、Zabbix-模板,应用集,监控项,触发器
本篇内容,将模板,应用集,监控项,触发器放在一起,因为我们建立使用的监控项和触发器,大多数都是对多台机器使用的,很少有一个监控项对应一个主机的情况. 一.模板 1.什么是模板? 个人理解,模板就是模板 ...
- c++ 加载库错误问题解决
转载自:http://blog.csdn.net/sahusoft/article/details/7388617 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: ...
- C++ vector、list和deque的区别 (整理)
1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变.因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内 ...
- 蚁群算法解决TSP问题
代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1 alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...
- Docker网络大揭秘(单机)
docker网络官网 https://docs.docker.com/network/ Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或将它们连接到非Docker工作负载.Dock ...
- MySQL数据库的特点和优势
MySQL数据库的特点和优势: 1.MySQL性能卓越.服务稳定,很少出现异常宕机. 2.MySQL开放源代码且无版权制约,自主性及使用成本低. 3.MySQL历史悠久,用户使用活跃,遇到问题可以寻求 ...
- uboot 主Makefile分析
一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...
- 剑指offer-用两个栈来实现一个队列-队列与栈-python
用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:使用两个栈,stackA 用来接收node stackB 用来接收 stackA 的出栈 # -*- cod ...
- lldb调试命令
XCode4.0以后,编译器换成了LLVM 编译器 2.0 与以前相比,更加强大:1.LLVM 编译器是下一带开源的编译技术.完全支持C, Objective-C, 和 C++.2.LLVM 速度比 ...
- python-xss攻击和单例模式
1.python中单例模式 class Foo: instance = None def __new__(cls, *args, **kwargs): if not Foo.instance: Foo ...