写在前面:

最近写作业的时候,用到了多项式来构造哈希函数(散列函数),也正因如此,我遇到了秦九韶算法(Horner法则)。

秦九韶算法:

假定现在有一个n次多项式需要计算。

按照朴素算法来计算,我们需要次乘法次加法。我们知道做乘法的代价是很高的,所以朴素算法是非常低效的。


那么,现在引入今天的重头戏——秦九韶算法(Horner法则)。

这样,对于一个n次多项式,我们至多需要做n次乘法和n次加法。

代码实现:(编译器:DEVC++)

为例。

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cmath>
using namespace std;const int MAX_Number = 1000;// 多项式最大项数,即多项式阶数+1
const int MAX_Time = 1e3;// 被测函数最大重复调用次数
const double CLOCKS_PER_SECOND = ((clock_t)1000);//CLOCK_PER_SECOND这个常量表示每一秒(per second)有多少个时钟计时单元
const double CLOCKS_PER_MILLISECOND = ((clock_t)1);//CLOCK_PER_SECOND这个常量表示每毫秒(per millisecond)有多少个时钟计时单元clock_t startTime;
clock_t endTime;
double duration;// (平均)运行时间 // 朴素算法
double f1(int n, double a[], double x)
{int i;double p = a[0];for (i = 1; i <= n; i++){p += (a[i] * pow(x, i));}return p;
}// 秦九韶算法
double f2(int n, double a[], double x)
{int i;double p = a[n];for (i = n; i>0; i--){p = p * x + a[i - 1];}return p;
}
// 让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算平均每次运行的时间即可
int main()
{int i;double a[MAX_Number];// 存储多项式系数 for (int i = 0; i<MAX_Number; i++)// 赋值多项式系数 {a[i] = (double)i;}startTime = clock();for (int i = 0; i<MAX_Time; i++)// 重复调用函数以获得充分多的时钟打点数 {f1(MAX_Number - 1, a, 1.1);}endTime = clock();duration = (double)(endTime - startTime) / CLOCKS_PER_SECOND / MAX_Time;//printf("ticks1=%lf\n",(double)(endTime-startTime));printf("duration1=%.10lf s\n", duration);startTime = clock();for (int i = 0; i<MAX_Time; i++)// 重复调用函数以获得充分多的时钟打点数{f2(MAX_Number - 1, a, 1.1);}endTime = clock();duration = (double)(endTime - startTime) / CLOCKS_PER_SECOND / MAX_Time;//printf("ticks2=%f\n",(double)(endTime-startTime));printf("duration2=%.10lf s\n", duration);
}

9次多项式

99次多项式

clock()函数:

  • clock():捕捉从程序开始运行到clock()被调用所消耗的时间。时间单位是clock tick。

  • clock_t:clock()函数返回的变量类型

  • 头文件:ctime

  • 定义时间常数:

  1. const double CLOCKS_PER_SECOND = ((clock_t)1000);
    其中,CLOCK_PER_SECOND这个常量表示每一秒(per second)有多少个时钟计时单元
  2. const double CLOCKS_PER_MILLISECOND = ((clock_t)1);
    其中,CLOCK_PER_SECOND这个常量表示每毫秒(per millisecond)有多少个时钟计时单元

具体步骤:

  1. clock_t start, end;
  2. 记录开始时间:start = clock();
  3. 写代码块
  4. 记录结束时间:end = clock();
  5. 输出运行时间:cout << (double)(end - start) / CLOCKS_PER_SECOND << "s" << endl;
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cmath>
using namespace std;const double CLOCKS_PER_SECOND = ((clock_t)1000);
const double CLOCKS_PER_MILLISECOND = ((clock_t)1);
clock_t start,end;int main()
{start=clock();MyFunction();// 代码块end=clock();cout<<(double)(end-start)/CLOCKS_PER_SECOND<<"s"<<endl;cout<<(double)(end-start)/CLOCKS_PER_MILLISECOND<<"ms"<<endl;} 

HDU1212——Big Number

题意:【大整数取模】

给你一个长度不超过1000的大数A,还有一个数值不超过100000的B,快速求A % B。

分析:

秦九韶算法可知,任意一个整数可以拆分为:

例如:

则大整数取模,就可以转化为n个多项式每步取模。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;string str;
int mod;int Horner()
{int ans=0;for(int i=0;i<str.size();i++){ans=(ans*10+str[i]-'0')%mod;}return ans;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);while(cin>>str){cin>>mod;cout<<Horner()<<endl;}return 0;
}

数论 | 秦九韶算法(Horner法则)相关推荐

  1. 秦九韶算法 Horner算法

    秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法.在西方被称作霍纳算法(Horner algorithm或Horner scheme),是以英国数学家威廉·乔治·霍纳命名的. 把一个n次 ...

  2. 数值分析 | 多项式求值(Horner法则)

    Horner法则 又名秦九韶算法或嵌套乘法,是一种高效的多项式求值算法. 对于 n n n次多项式 f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + ...

  3. 求幂运算、多项式乘法及Horner法则的应用

    一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 retu ...

  4. PAT甲级1015 Reversible Primes :[C++题解]进制位、秦九韶算法、判质数

    文章目录 题目分析 题目链接 题目分析 十进制转化为d进制如何做? while(n){n% d; //取d进制数下的最低位n/=d; } 比如 十进制下的n=13 ,进制d =2.经过 反复的n%d ...

  5. PAT甲级1010 Radix :[C++题解]进制位、秦九韶算法、二分(PAT通过率最低的一道题0.11)

    文章目录 题目分析 题目链接 题目分析 分析: 本题思路分两步. 第一步:先把给出数值和进制的数,暂定为N1,转换成10进制,即为target. 第二步: 判断一下N2在多少进制下是等于target的 ...

  6. 秦九韶算法matlab实验报告,数值分析上机实验报告.doc

    实验报告一 题目: (绪论) 非线性方程求解及误差估计 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要.本实验采用两种常见的求解方法二分法.Newton法和改进的Newton法 ...

  7. 秦九韶算法matlab程序,数值分析matlab程序实例.doc

    数值分析matlab程序实例 1,秦九韶算法,求出P(x=3)=2+4x+5x^2+2x^3的值 clear?all; x=3; n=3; a(1)=2;a(2)=4;a(3)=5;a(4)=2 v( ...

  8. 【codevs3732】【BZOJ3751】解方程,hash+秦九韶算法

    传送门1 传送门2 写在前面:傻逼字符串毁我青春,颓我精神 思路: 30分:直接暴力1-m枚举就行,每次进行n次运算,然后验证即可,时间复杂度O(nm) 50分:在30分的基础上加上高精度(听Shal ...

  9. Python一句话实现秦九韶算法快速计算多项式的值

    关于秦九韶算法快速计算多项式值的原理描述请参考之前推送的文章Python使用秦九韶算法求解多项式的值.本文重点演示Python函数reduce()和lambda表达式的用法.代码没加注释,如果不好理解 ...

  10. [AcWing] 2058. 笨拙的手指(C++实现)秦九韶算法

    [AcWing] 2058. 笨拙的手指(C++实现)秦九韶算法 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 1 ...

最新文章

  1. 彻底搞懂机器学习中的正则化
  2. 第十九篇:主题建模Topic Modelling
  3. 【转】Step By Step在VS2008中完整配置Ajax Toolkit的使用(配图)
  4. HTML默认样式表CSS属性
  5. C语言之程序中内存的来源:栈 堆 数据段
  6. 车辆出厂信息接口_航测遥感中心“漳州核电智慧工地管理系统平台”通过出厂验收...
  7. 我很生气,帮了不足一个月就离开了
  8. mysql 范围索引 els_MySQL 复习笔记
  9. mysql数据库xp下载64位_navicat premium 64位
  10. 麻烦不断的国外科技公司排行榜:苹果惨上榜
  11. Python学习笔记-北京图灵学院-变量-20200528
  12. 构建之法---第一次作业
  13. python操作word、ppt、pdf
  14. 安装vs2005 sp1 出现错误 1718
  15. Profile介绍与使用
  16. 云服务器和共享主机,共享虚拟主机、独享虚拟主机还是云服务器?
  17. python 自动生成数字_python – 使用yaml自动生成配置和具有数字...
  18. C++知识点打结(二)
  19. 关于FLASH元件包含按钮的一个问题…
  20. Oracle授权普通用户 kill session权限

热门文章

  1. linux路由器还原,openwrt路由器恢复出厂设置的方法
  2. 台式计算机无法连接网络,台式电脑无法连接无线网络怎么办
  3. 【转载】Web2.0创业时代将终结
  4. Laya发布魅族小游戏,调试前步骤
  5. android 国际化之Locale
  6. 宏发41F-1Z-C2接线
  7. 局域网、以太网、无线局域网学习笔记
  8. 医师计算机考试,医师资格考试机考-计算机作答的操作指导
  9. 苹果系统中国日历服务器,简单三步,让 iPhone 自带日历 App 显示国家节假日安排...
  10. [译]const T vs. T const ——Dan Saks 【翻译】