ソースコードの説明.

Hash 単純なハッシュ

多項式f(x)=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0の値をHornerの方法を用いて計算する。

上式いおいて、a_nx^n、a_{n-1}x^{n-1}、...、a_1x、a_0の各項を独立に計算して加えるという単純な方法では、n(n+1)/2+n回の掛け算とn回の足し算を行うことになる。具体例として、a_0=1、a_1=2、a_2=3、a_3=4、a_4=5のf(x) = 5x^4 + 4x^3 + 3x^2 + 2x + 1について考える。

となり、これを一般式で表せば という漸化式である。これをHorner(ホーナー)の方法という。この方法だとn回の掛け算とn回の足し算だけで多項式の計算を行うことができる。プログラムではa_0 ~ a_nは配列a[0] ~ a[n]に対応する。

ソースコード

源文件
/*
 *-----------------------------
 *   Horner(ホーナー)の方法
 *-----------------------------
 * Great by liang@Ryukyus
 * Compiler : gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
 * Date : 28/12/2010
 */

#include <stdio.h>

double fn(double,double *,int);
int main(void){

  double a[]={1,2,3,4,5};
  double x;

  for(x=1; x<=5;x++){
    printf("fn(%f)=%f\n",x,fn(x,a,4));
  }
  return 0;
}

double fn(double x, double a[],int n){

  double p;
  int i;

  p = a[n];
  for(i=n-1; i>=0; i--){
    p = p*x+a[i];
  }
  return p;
}

実行結果

fn(1.000000)=15.000000
fn(2.000000)=129.000000
fn(3.000000)=547.000000
fn(4.000000)=1593.000000
fn(5.000000)=3711.000000
Chapter3 @ 目録 @ HomeWork List @ 昭亮's Homepage