不定長多項式展開後,展開式各階係數的Java代碼實現

問題:多項式(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);
        }
    }
}

本文及代碼均爲原創,轉載請附上本文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章