多项式求逆

前言

赶紧补坑

求解

大概是求:
A(x)B(x)≡1 (mod xn)A(x)B(x)\equiv1\ (mod\ x^n)A(x)B(x)1 (mod xn)
注意我们可以很容易求:
A(x)B(x)≡1(mod x1)A(x)B(x)\equiv1(mod\ x^1)A(x)B(x)1(mod x1)
考虑如何把问题规模减半,假设我们知道了模x⌈n2⌉x^{\lceil \frac{n}{2} \rceil}x2n的逆元C(x)C(x)C(x)
A(x)C(x)≡1(mod x⌈n2⌉)A(x)C(x)\equiv1(mod\ x^{\lceil \frac{n}{2} \rceil})A(x)C(x)1(mod x2n)
与原式相减可得:
B(x)−C(x)≡0(mod x⌈n2⌉)B(x)-C(x)\equiv0(mod\ x^{\lceil \frac{n}{2} \rceil})B(x)C(x)0(mod x2n)
两边平方,注意模域可以平方(手画卷积可以发现):
B2(x)−2B(x)C(x)+C2(x)≡0(mod xn)B^2(x)-2B(x)C(x)+C^2(x)\equiv0(mod\ x^n)B2(x)2B(x)C(x)+C2(x)0(mod xn)
乘上A(x)A(x)A(x)后移项可得:
B(x)≡2C(x)−A(x)C2(x)(mod xn)B(x)\equiv2C(x)-A(x)C^2(x)(mod\ x^n)B(x)2C(x)A(x)C2(x)(mod xn)
至此,求解变成子问题,乘法通过FFT优化,可以做到O(nlog⁡n)O(n\log n)O(nlogn)

模板

void inv(int ln,int *a,int *b){
	if(ln==1){
		b[0]=qpow(a[0],mo-2);
		return;
	}
	inv((ln+1)>>1,a,b);
	int cnt=0;
	for(fn=1;fn<(ln<<1);fn<<=1) ++cnt;
	fo(i,1,fn-1) rev[i]=rev[i>>1]>>1|(i&1)<<(cnt-1);
	fo(i,0,ln-1) c[i]=a[i];
	fo(i,ln,fn-1) c[i]=b[i]=0;
	NTT(c,1),NTT(b,1);
	fo(i,0,fn-1) b[i]=(2-(ll)c[i]*b[i]%mo+mo)%mo*b[i]%mo;
	NTT(b,-1);
	fo(i,ln,fn-1) b[i]=0;
}
在Java中,多项式通常是指找到一个多项式,使得它们的乘积等于恒等多项式1。这个过程可以视为多项式函数的运算,即解反函数。不过,需要注意的是,并非所有的多项式都有,只有那些非零常数项的多项式才有可能有。对于这样的多项式,我们可以利用除法的思想来近似计算。 一个简单的实现方法是使用拉格朗日插值法构建多项式,但是直接计算多项式在数值上可能会不稳定,因此更常见的是在数学软件库(如Apache Commons Math)中使用专门的算法,例如Bezout's identity(贝祖定理)或者使用多项式长除法。 以下是一个基本的示例,展示了如何使用`java.math.BigInteger`类(用于处理大整数)来实现多项式: ```java import java.math.BigInteger; public class PolynomialInversion { public static BigInteger[] inverse(BigInteger[] coefficients) { if (coefficients[0].equals(BigInteger.ZERO)) throw new IllegalArgumentException("Zero polynomial has no inverse."); // 倒序系数数组以便从最高次幂开始 BigInteger[] reversed = reverse(coefficients); // 计算系数的元 BigInteger[] inverses = new BigInteger[reversed.length]; for (int i = 0; i < reversed.length; i++) { inverses[i] = reversed[i].modInverse(reversed[reversed.length - 1]); } return reverse(inverses); // 将结果反转回原始顺序 } private static BigInteger[] reverse(BigInteger[] array) { BigInteger[] reversed = new BigInteger[array.length]; System.arraycopy(array, 0, reversed, reversed.length - 1, reversed.length); return reversed; } } ``` 在这个例子中,`inverse()`方法接收一个系数数组(按照降序排列),然后依次计算每个系数的模,最后返回向的系数数组。请注意,这只是一个简化的版本,实际应用中需要考虑更多的边界条件和精度问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值