基本数学问题——多项式的计算

/**
 * @ClassName TestDemo12
 * @Description 多项式计算
 * @Author lzq
 * @Date 2018/11/30 14:18
 * @Version 1.0
 **/
public class TestDemo12 {
    /**
     * 一元多项式求解
     *
     * p(x) = array[i]*x^i
     *
     * 例子:
     * array = {1,2,-3};
     * 意思就是:
     * array[0]*x^0+array[1]*x^1+array[2]*x^2 ======>  1+2x-3x^2
     *
     * @param array 多项式的系数(次数由低到高)
     * @param x  多项式变量值
     * @return   多项式在指定的x的值
     */
    public static double polynomial_1_D(double[] array,double x) {
        int n = array.length;
        double result = array[n-1];
        for(int i = n-2;i >= 0;i--) {
            result = result*x+array[i];
        }
        return result;
    }

    /**
     *  二元多项式求解
     *  p(x,y) = array[i][j]*x^i*y^j  array[i][j]就是系数,然后每一个array[i]数组
     *  放的都是x^i,  每一个array[i]数组内从前往后递增的是y的指数j
     *
     *  举个例子:array = {{1,2},{1,-2}}; 依次放的就是
     *  array[0][0]*x^0*y^0+array[0][1]*x^0*y^1+array[1][0]*x^1*y^0+
     * array[1][1]*x^1*y^1
     * 
     *  即表示:1+2y+x-2xy
     *
     * @param array 多项式的系数(次数由低到高)
     * @param x 多项式变量值
     * @param y 多项式变量值
     * @return 多项式在指定的x、y的值
     */
    public static double polynomial_2_D(double[][] array,double x,double y) {
        int i,j;
        int m = array.length;
        int n;
        double result = 0.0,temp,tt = 1.0;
        for(i = 0;i < m;i++) {
            n = array[i].length;
            temp = array[i][n-1]*tt;
            for(j = n-2;j >= 0;j--) {
                temp = temp*y+array[i][j]*tt;
            }
            result += temp;
            tt *= x;
        }
        return result;
    }


    /**
     * 多项式乘法
     *
     * 例如:
     * A(x) = 2x^5+3x^4-x^3+2x^2+5x-4
     * B(x) = 3x^3+x^2-2x-3
     * 那么得到的R(x) = A(x)*B(x)
     * R(x) = 6x^8+11x^7-4x^6-7x^5+10x^4-8x^3-20x^2-7x+12
     * 要是想要计算这个多项式的值的话调用polynomial_1_D()传入参数就可以了
     *
     * @param A 多项式A(x)
     * @param B 多项式B(x)
     * @param R 多项式A(x)与多项式B(x)的乘积
     */
    public static void polynomial_multiplication(double[] A,double[] B,
    double[] R) {
        int m = A.length;
        int n = B.length;
        int k = R.length;
        int i,j;
        //初始化
        for(i = 0;i < k;i++) {
            R[i] = 0.0;
        }
        //计算各项系数
        for(i = 0;i < m;i++) {
            for(j = 0;j < n;j++) {
                R[i+j] += A[i]*B[j];
            }
        }
    }

    /**
     * 多项式除法
     *
     * 就行普通的除法一样,有商有余数
     *
     * @param A 多项式A(x)
     * @param B 多项式B(x)
     * @param R 多项式A(x)与多项式B(x)的商
     * @param E 多项式A(x)与多项式B(x)的余数
     */
    public static void polynomial_division(double[] A,double[] B,
    double[] R,double[] E) {
        int m = A.length;
        int n = B.length;
        int k = R.length;
        int e = E.length;
        int i,j,mm,ee;
        //初始化
        for(i = 0;i < k;i++) {
            R[i] = 0.0;
        }
        ee = m-1;
        for(i = k;i > 0;i--) {
            R[i-1] = A[ee]/B[n-1];  //除法,计算商,多项式系数
            mm = ee;
            for(j = 1;j <= n-1;j++) {
                A[mm-1] -= R[i-1]*B[n-j-1];
                mm -= 1;
            }
            ee -= 1;
        }
        for(i = 0;i < e;i++) {
            E[i] = A[i];
        }
    }

    /**
     * 打印,这个写的比较麻烦,但这个就只是打印,不是重点
     * @param R
     */
    public static void fun(double[] R) {
        boolean sign = false;
        for(int i = R.length-1;i >= 0;i--) {
            if(R[i] > 0) {
                if(sign == false) {  //打印第一个元素
                    sign = true;
                    if(i == 1) {   //打印一次项系数
                        System.out.print(R[i] + "x");
                    }else if(i == 0) {      //打印最后一个元素
                        System.out.print(R[i]);
                    }else {
                        System.out.print(R[i] + "x^" + i);
                    }
                    continue;
                }
                if(i == 1) {   //打印一次项系数
                    System.out.print("+" + R[i] + "x");
                }else if(i == 0) {      //打印最后一个元素
                    System.out.print("+" + R[i]);
                }else {
                    System.out.print("+" + R[i] + "x^" + i);
                }
            }else {
                if(sign == false) {  //打印第一个元素
                    sign = true;
                    if(i == 1) {   //打印一次项系数
                        System.out.print(R[i] + "x");
                    }else if(i == 0) {      //打印最后一个元素
                        System.out.print(R[i]);
                    }else {
                        System.out.print(R[i] + "x^" + i);
                    }
                    continue;
                }
                if(i == 1) {   //打印一次项系数
                    System.out.print(R[i] + "x");
                }else if(i == 0) {
                    System.out.print(R[i]);
                }else {
                    System.out.print(R[i] + "x^" + i);
                }
            }
        }
        System.out.println();
    }

public static void main(String[] args) {
        double[] a = {1,2,-3};
        System.out.println("一元多项式为:");
        fun(a);
        System.out.println("当x = 2时计算一元多项式结果:");
        System.out.print(polynomial_1_D(a,2)+"\n");

        double[][] b = {{1,2},{1,-2}};
        System.out.println("\n计算二元多项式结果:");
        System.out.print(polynomial_2_D(b,1,1)+"\n");

        double[] A = {-4.0,5.0,2.0,-1.0,3.0,2.0};
        double[] B = {-3.0,-2.0,1.0,3.0};
        double[] R = new double[9];
        polynomial_multiplication(A,B,R);
        System.out.print("\nA(x) = ");
        fun(A);
        System.out.print("B(x) = ");
        fun(B);
        System.out.println("两多项式的乘积为:");
        fun(R);

        double[] A2 = {-3.0,6.0,-3.0,4.0,2.0};
        double[] B2 = {-1.0,1.0,1.0};
        double[] R2 = new double[3];
        double[] E = new double[2];
        polynomial_division(A2,B2,R2,E);
        System.out.print("\nA(x) = ");
        fun(A2);
        System.out.print("B(x) = ");
        fun(B2);
        System.out.println("两多项式相除的商的系数");
        for(int i = 0;i < R2.length;i++) {
            System.out.print("R("+i+") = "+R2[i]+"\n");
        }
        System.out.print("两多项式相除的商:");
        fun(R2);
        System.out.println("两多项式相除的余数的系数");
        for(int i = 0;i < E.length;i++) {
            System.out.print("E("+i+") = "+R2[i]+"\n");
        }
        System.out.print("两多项式相除的余:");
        fun(E);
    }
}

运行结果:

一元多项式为:
-3.0x^2+2.0x+1.0
当x = 2时计算一元多项式结果:
-7.0

计算二元多项式结果:
2.0

A(x) = 2.0x^5+3.0x^4-1.0x^3+2.0x^2+5.0x-4.0
B(x) = 3.0x^3+1.0x^2-2.0x-3.0
两多项式的乘积为:
6.0x^8+11.0x^7-4.0x^6-7.0x^5+10.0x^4-8.0x^3-20.0x^2-7.0x+12.0

A(x) = 2.0x^4+2.0x^3-3.0x^2+11.0x-6.0
B(x) = 1.0x^2+1.0x-1.0
两多项式相除的商的系数
R(0) = -3.0
R(1) = 2.0
R(2) = 2.0
两多项式相除的商:2.0x^2+2.0x-3.0
两多项式相除的余数的系数
E(0) = -3.0
E(1) = 2.0
两多项式相除的余:11.0x-6.0

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/84667609
今日推荐