求幂运算、多项式乘法及Horner法则的应用
一,两种不同的求幂运算
求解x^n(x 的 n 次方)
①使用递归,代码如下:
private static long pow(int x, int n){
if(n == 0)
return 1;
if(n == 1)
return x;
if(n % 2 == 0)
return pow(x * x, n / 2);
else
return pow(x * x, n / 2) * x;
}
分析:
每次递归,使得问题的规模减半。2到6行操作的复杂度为O(1),第7行pow函数里面的x*x操作复杂度为O(1)
故时间复杂度公式:T(N)=T(N/2)+O(1) => T(N)=O(logN)
②普通方式求幂
private static long pow2(int x, int n){
if(x == 0)
return 0;//0^n == 0
long p = 1;
for(int i = 0; i < n; i++)
p *= x;
return p;
}
显然,时间复杂度为O(N)
二,求解多项式乘法
公式:f(x,n) = a(0)x^0 + a(1)x^1 + a(2)x^2+...+a(n)x^n
比如:f(10,4)=a(0)10^0 + a(1)10^1 + a(2)10^2 + a(3)10^3+a(4)10^4
代码如下:
public static long poly(int[] arr, int x, int n){
long sum = 0;
for(int i = 0; i <= n; i++){
sum += arr[i] * pow(x, i);
}
return sum;
}
private static long pow(int x, int n){
if(n == 0)
return 1;
if(n == 1)
return x;
if(n % 2 == 0)
return pow(x * x, n / 2);
else
return pow(x * x, n / 2) * x;
}
Horner法则求解多项式乘法,参考:
public static long poly2(int[] arr, int x, int n){//arr存储系数, x 表示基数, n 表示幂
long poly = 0;
for(int i = n; i >= 0; i--)
poly = poly * x + arr[i];
return poly;
}
对比采用Horner法则计算多项式乘法与这篇文章: 字符串转换成数字
public int atoi(char[] s){
int result = 0;
for(int i = 0; i < s.length; i++)
result = result * 10 + s[i] - '0';// 相当于 poly2(...)中的 x=10
return result;
}
可以看出,二者有很大的相似性。其实,不难看出,字符串转换成数字使用的正是Horner法则。
由此,得到启发,在进制转换中,如:八进制转十进制,相当于 x = 8。
故可写出一个常用的进制转换程序,如下:
//x 表示进制, 若x=8,表示将8进制转换成10进制
public static long convert(char[] arr, int x){
long result = 0;
for(int i = 0; i < arr.length; i++)
result = result * x + arr[i] - '0';
return result;
} //str 表示原来进制的数,如:convert("456", 8) 456 --> 302
public static long convert2(String str, int x){
long result = 0;
for(int i = 0; i < str.length(); i++)
result = result * x + Integer.valueOf(str.charAt(i) - '0');
return result;
}
十六进制转十进制,相当于 x = 16。
public static long convert2(String str, int x){//x = 16
long result = 0;
char c;
str = str.toUpperCase();//"abF8"-->"ABF8"
for(int i = 0; i < str.length(); i++)
{
c = str.charAt(i);
if(c >= 'A' && c <= 'F')
result = result * x + (c - 'A') + 10;
else
result = result * x + c - '0';
}
return result;
}
因此,进制转换、字符串转换成数字、多项式求值都可以使用Horner法则来求解。
求幂运算、多项式乘法及Horner法则的应用的更多相关文章
- FFT求卷积(多项式乘法)
FFT求卷积(多项式乘法) 卷积 如果有两个无限序列a和b,那么它们卷积的结果是:\(y_n=\sum_{i=-\infty}^\infty a_ib_{n-i}\).如果a和b是有限序列,a最低的项 ...
- 小白专场-多项式乘法与加法运算-python语言实现
目录 题意理解 解题思路 多项式加法 多项式乘法 完整代码 题意理解 题目: 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一 ...
- AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)
题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...
- [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)
卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...
- 二分求幂/快速幂取模运算——root(N,k)
二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...
- 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂
牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...
- [BZOJ3684][拉格朗日反演+多项式求幂]大朋友和多叉树
题面 Description 我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树.对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为\(1\)的结点是叶子结 ...
- 求幂&&快速幂&&位运算
1.普通的求幂方法: 时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE int pow(int base,int p){ int ans=1; for(int i=1;i<=p;i+ ...
- 【luogu P3803】【模板】多项式乘法(FFT)
[模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...
随机推荐
- [转帖]Nginx的超时keeplive_timeout配置详解
Nginx的超时keeplive_timeout配置详解 https://blog.csdn.net/weixin_42350212/article/details/81123932 Nginx ...
- 用SoapUI 测试Web Service
如何测试写好的Webservice? 方法一:写代码来测试,但还是太麻烦,你得花时间去学习各语言的关于Webservice调用的相关API. 方法二:使用Webservice开发的必备工具- Soap ...
- matplotlib绘图3
#scatter fig=plt.figure() ax=fig.add_subplot(3,3,1)#3行3列 第一个图 n=128 X=np.random.normal(0,1,n) Y=np.r ...
- jdk1.8 HashMap的扩容resize()方法详解
/** * Initializes or doubles table size. If null, allocates in * accord with initial capacity target ...
- NOIP2018滚粗记
NOIP2018滚粗记 day 0 上午,说是可以休息,然后睡到快9点起来吃个早饭去了机房.刷了几个板子就十二点了 下午大概就是看别人总结,颓知乎,完全没心思写代码. 晚上不要求,然后在寝室颓了一下, ...
- liunx速查
文件和目录 Linux 主要目录速查表 /:根目录,一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 当在终端里输入 /home,其实是在告诉电脑,先从 /(根目 ...
- Uva10474-STL水题-白书
白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> ...
- Spring StringRedisTemplate 配置
1 先看pom.xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>c ...
- UVa - 10341
Solve the equation:p ∗ e ^−x + q ∗ sin(x) + r ∗ cos(x) + s ∗ tan(x) + t ∗ x ^2 + u = 02 + u = 0where ...
- IDEA常见设置
对于eclipse实在忍无可忍,各种功能各种bug..换回IDEA IDEA常见问题(其实不是问题,代码规范而已) 1.解决无限 This file is indented with tabs ins ...