/**
* 设定多项式的系数,为1.0 ~ 10.0之间的随机数
* @param num
* @return
*/
public ArrayList<Double> getRandomCoefficient(Integer num){
ArrayList<Double> arrayList = new ArrayList<Double>();
Random random = new Random();
while (num >=0){
arrayList.add((double) Math.round(random.nextDouble()*10));
num--;
}
return arrayList;
}
/**
* 秦九韶算法计算结果
* @param arrayList
* @param X
* @return
*/
public Double getResultByQjsh(ArrayList<Double> arrayList,Float X){
ArrayList<Double> doubleLists = (ArrayList<Double>) arrayList.clone();
Double V = doubleLists.get(0); // b0 = a0
doubleLists.remove(0);
long start = System.currentTimeMillis();
for (Double An:
doubleLists) {
V = X * V + An; //B(i) = B(i-1)*x + Ai
}
long end = System.currentTimeMillis();
logger.info("秦九韶算法所用时间为:"+(end - start) + "毫秒");
return V; //f(Xn) = V
}
/**
* 传统的多项式计算方式
* @param arrayList
* @param X
* @return
*/
public Double getResultByOld(ArrayList<Double> arrayList,Float X){
/*
* 1.多项式系数
* 2.各个X项的幂 ,ArrayList<Integer> xlists
* 3.两层循环求多项式的值
* */
/* int lenc = arrayList.size();
int lenx = xlists.size();
float temp = 0;
double P = 0;
for (int i = 0; i < lenc; i++) {
double coefficient = arrayList.get(i);
for (int j = 0; j < lenx; j++) {
Integer integer = xlists.get(j);
while (integer >= 0){
temp = temp*X;
}
}
P = P + coefficient*temp;
}*/
// return P;
int N = arrayList.size() - 1;//系数个数的大小减去1就是X项的最高次
Double res = 0D;
long start = System.currentTimeMillis();
for (Double An:
arrayList) {
Double Xn = 1D;
int i = 0;
while(i <N){
Xn = Xn * X;
i++;
}
N--;
res = res +An*Xn;
}
long end = System.currentTimeMillis();
logger.info("传统的计算方法用时为:"+(end - start)+"毫秒");
return res;
}
@Test
public void test(){
ArrayList<Double> randomCoefficient = getRandomCoefficient(10);
Double resultByQjsh = getResultByQjsh(randomCoefficient, 8f);
logger.info("计算结果为:"+resultByQjsh);
Double resultByOld = getResultByOld(randomCoefficient, 8f);
logger.info("计算结果为:"+resultByOld);
}