多项式计算与乘除[Java实现]

package com.algorithm;

import java.util.EnumMap;

import com.algorithm.Polynomial.DIV;

public class Polynomial {

    /**
     * 计算多项式的值
     * 内部逻辑是一个简单递归
     * @param para 多项数参数组成的数组 para[0]是常数项,para[1]是一次项,以此类推
     * @param x 变量的数值
     * @return 变量值对应的多项式值
     */
    public static double polynomial1D(double[] para,double x){
        double result=0;
        for(int i=para.length-1;i>=0;i--){
            result=result*x+para[i];
        }
        return result;
    }

    /**
     * 计算二元多项式的值
     * 将整个计算分成两步,第一步计算一个变量的多项式值,第二步乘上另一个变量
     * @param para 二元多项式的系数二维数组
     * @param x 变量1
     * @param y 变量2
     * @return 计算数值
     */
    public static double polynomial2D(double[][] para,double x,double y){
        double result=0;
        int nx=para.length;
        for(int i=nx-1;i>=0;i--){
            result=result*x+polynomial1D(para[i],y);
        }
        return result;
    }

    /**
     * 多项式乘法
     * @param a
     * @param b
     * @return 相乘后的多项式系数数组
     */
    public static double[] polynomial_mul(double[] a,double[] b){
        int na=a.length;
        int nb=b.length;
        double[] r=new double[na+nb-1];//新建一个乘积多项式参数数组,数组元素的个数是na+nb-1
        for(int i=0;i<na+nb-1;i++){
            r[i]=0.0;//逐个初始化
        }
        for(int j=0;j<na;j++){
            for(int k=0;k<nb;k++){
                r[j+k]+=a[j]*b[k];//逐个相乘,累加
            }
        }

        return r;
    }

    /**
     * 多项式除法
     * @param a 被除多项式
     * @param b 除数多项式
     * @param r 商多项式
     * @param l 余数多项式
     * 综合除法
     */

    public static void polynomial_div(double[] a,double[] b,double[] r,double[] l){
        int na=a.length;
        int nb=b.length;
        int nr=r.length;
        int nl=l.length;
        int ta,tb;
        ta=na-1;
        for(int i=0;i<nr;i++){
            r[i]=0.0;
        }
        for(int i=nr;i>0;i--){
            r[i-1]=a[ta]/b[nb-1];
            tb=ta;
            for(int j=1;j<=nb-1;j++){
                a[tb-1]-=r[i-1]*b[nb-j-1];
                tb-=1;
            }
            ta-=1;
        }
        for(int i=0;i<nl;i++){
            l[i]=a[i];
        }

    } 

    public enum DIV{
        SHANG,YUSHU;
    }
    /**
     * 多项式除法另一种实现,返回由商和余数多项式系数数组组成的EnumMap
     * 这样做是为了解决同时输出两个对象的需求,好处是不需要在调用方法时认为定义并计算商和余数多项数参数数组
     * EnumMap比较少见,实质上实现和定义一个处罚结果类相似
     * 代码依然不算优雅
     * @param a
     * @param b
     * @return
     */
    public static EnumMap<DIV, double[]> polynomial_div(double[] a,double[] b){
        int na=a.length;
        int nb=b.length;
        int nr=na-nb+1;
        int nl=nb-1;

        double[] r=new double[a.length-b.length+1];
        double[] l=new double[b.length-1];
        int ta,tb;
        ta=na-1;
        for(int i=0;i<nr;i++){
            r[i]=0.0;
        }
        for(int i=nr;i>0;i--){
            r[i-1]=a[ta]/b[nb-1];
            tb=ta;
            for(int j=1;j<=nb-1;j++){
                a[tb-1]-=r[i-1]*b[nb-j-1];
                tb-=1;
            }
            ta-=1;
        }
        for(int i=0;i<nl;i++){
            l[i]=a[i];
        }

        EnumMap<DIV,double[]> enumMap=new EnumMap<DIV, double[]>(DIV.class);
        enumMap.put(DIV.SHANG, r);
        enumMap.put(DIV.YUSHU, l);
        return enumMap;
    }

    /**
     * 测试一元多项式计算
     */
    public static void test1(){
        double a[]={1,2,3};
        System.out.println(polynomial1D(a,2)); 
    }

    /**
     * 测试二元多项式计算
     */
    public static void test2(){
        double b[][]={{1,2,3},{4,5,6}};
        System.out.println(polynomial2D(b, 1, 2));
    }

    /**
     * 测试多项式乘法
     */
    public static void test3(){
        double a[]={1,2,3};
        double b[]={3,2,6};
        double[] r=polynomial_mul(a, b);
        for(double d:r){
            System.out.println(d);
        }
    }

    /**
     * 测试多项式除法
     */
    public static void test4(){
        double[] m={-3,6,-3,4,2};
        double[] n={-1,1,1};

        double[] rr=new double[m.length-n.length+1];
        double[] ll=new double[n.length-1];
        polynomial_div(m,n,rr,ll);
        for(double d:rr){
            System.out.print(d+" ");
        }
        System.out.println();
        for(double d:ll){
            System.out.print(d+" ");
        }
        System.out.println();
    }

    /**
     * 测试多项式除法
     */
    public static void test5(){
        double[] m={-3.5,6.4,-3,4,2};
        double[] n={-1,1.2,1};

        EnumMap<DIV, double[]> divResultMap=polynomial_div(m,n);
        double[] rr=(double[]) divResultMap.get(DIV.SHANG);
        double[] ll=(double[]) divResultMap.get(DIV.YUSHU);
        for(double d:rr){
            System.out.print(d+" ");
        }
        System.out.println();
        for(double d:ll){
            System.out.print(d+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        test1();
        test2();
        test3();
        test4();
        test5();


    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值