/**
* @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