問題:多項式(x+a1)(x+a2)(x+a3)....(x-ak)=b0+b1*x+....b(k-1)*x^(k-1),已知a1...ak計算b0...bk-1
此類方程式是我在實現k out of n的不經意傳輸協議時遇到的一個問題,不定階多項式分解我要怎麼拿到每一未知項前面的係數呢?
經過思考最終使用遞歸的思想去解決了該問題。
此類多項式的分解若用手算則是每一對()裏面分別取x或a來計算,之後再把不同選擇得到的結果加起來,則可得到b0+b1*x+....b(k-1)*x^(k-1)此形式的展開式。
每一個(x+a)作爲遞歸的一層,每一層有兩個分支,即取x還是取a,當算法訪問到葉子節點,則將得到的結果都加到記錄各項係數的總數組f2ratio當中,多項式(x+a1)(x+a2)(x+a3)....(x-ak)=b0+b1*x+....b(k-1)*x^(k-1),已知a1...ak計算b0...bk-1的java算法代碼實現代碼(可測試)附下:
package OTk_Out_Of_n;
import java.util.Random;
public class Receiver {
public final int K=2; //多項式的數量,最高階數
int f2[]=new int[K];
int f2ratio[]=new int[K+1]; //各階係數b
Random r=new Random();
public void initialF(int n){ //n爲a能取的上限,此處a的值都是隨機的,可改爲固定值
for(int i=0;i<f2.length;i++){
f2[i]=-r.nextInt(n);
f2ratio[i]=0;
}
}
int tempLayer=0;
int tempRatio=1;
int tempX=0; //當前層x的階
void dealF2Ratio(boolean flag){
if(tempLayer==K-1) {
if (flag==true){
f2ratio[tempX+1]+=tempRatio;
}else {
f2ratio[tempX]+=tempRatio*f2[tempLayer];
}
return;
}
tempLayer++;
if(flag==true){
tempX++;
dealF2Ratio(true);
dealF2Ratio(false);
tempX--;
}else{
tempRatio=tempRatio*f2[tempLayer-1];
dealF2Ratio(true);
dealF2Ratio(false);
tempRatio=tempRatio/f2[tempLayer-1];
}
tempLayer--;
}
public static void main(String[] args) {
Receiver receiver =new Receiver();
receiver.initialF(10);
receiver.dealF2Ratio(true);
receiver.dealF2Ratio(false);
for (int a:
receiver.f2) {
System.out.println(a);
}
int i=0;
for (int a:receiver.f2ratio
) {
System.out.println("x的階數爲"+(i++)+"的係數爲:"+a);
}
}
}
本文及代碼均爲原創,轉載請附上本文鏈接。