网站大量收购闲置独家精品文档,联系QQ:2885784924

a的n次方的快速算法.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
a的n次方的快速算法

a的n次方的快速算法 en二进制幂 对于a的n次幂求解这个问题,不少人看到后都觉得没有什么内容吧!我第一次想到这个问题也觉得没有什么内容,但是后来仔细想想,里面还真是有学问哦! 想想看如果我们求 a8 ,有以下两种方法 1. a8 = a * a * a * a * a * a * a * a 需要计算 7次乘法 2.a 8 = (a * a) * A * A (其中A = a * a) 需要计算3次乘法 对于这么简单的一个算法计算步骤差别的差别是很大的,那么对于一个通常的n怎么表示 普遍的求解方法呢? 经过多天的思考,始终没有结果,今天突然在一本书上看到有关这个求解的算法,心中大喜。把解决办法稍微整理一下,然后给出具体代码。 算法的思想 一般的对于 a (2x + b) = a2x * a b 所以就有 (b = 0时 ) : a 2x + b = (ax)2 ; (b = 1时): a 2x + b = (a x)2 * a ; 对于 an ,先把 n的二进制表示写出,那么有 an = a (n1 n2 n3 n4 ..)(2) = … 那么我们从左到右就可以如下表(n = 13的时候 1101) n的二进制位 1 1 0 1 累乘 a a2 * a = a3 (a3)2 = a6 (a6)2 * a = a13 第一种代码:(用java实现,用了函数调用,效果比较失败) package alg; public class AN { public static final int EXIT = 3; int a; // 底数 int bin; // 指数 public StackInteger s ; public AN(int a, int bin) { this.a = a; this.bin = bin; s = new StackInteger(); s.push(EXIT);// 作为最后一个的标志 toBin(bin); } public void renew( int a,int bin){ this.a = a ; this.bin = bin ; s.push(EXIT);// 作为最后一个的标志 toBin(bin); } // 从左往右算 public int leftToRight() { int i; int result = 1; while (true) { i = s.pop(); switch (i) { case 0: result *= result; break; case 1: result = result * result * a; break; case EXIT: return result; } } } public int rightToLeft(int a) { return 0; } /** * 把十进制转成二进制 压入栈中 * * @param ten */ public StackInteger toBin(int ten) { int temp = ten; int rest; do { rest = temp % 2; temp = (temp - rest) / 2; s.push(rest); } while (temp != 0); return s ; } public static void main(String[] args) { AN a = new AN(3, 15); StackInteger s = new StackInteger

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档