如何判断一个β位的整数n是否是某个整数的幂?

Flammable_ice 2014-04-20 05:14:45
时间复杂度控制在关于β的多项式时间内。并且这个幂是大于1的,这个n也是大于1的。PS:我只求得了关于n的多项式时间的算法。哪位大神来帮忙提示下思路?当然有关键代码更好了。。
...全文
167 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2014-04-22
  • 打赏
  • 举报
回复
引用 17 楼 lm_whales 的回复:
引用 15 楼 FancyMouse 的回复:
多项式肯定有。用质因子分解做说明你们方法错了。
哦更好的方法是什么,请指教!!
http://bbs.csdn.net/topics/390764977#post-397225978
lm_whales 2014-04-22
  • 打赏
  • 举报
回复
引用 15 楼 FancyMouse 的回复:
多项式肯定有。用质因子分解做说明你们方法错了。
哦更好的方法是什么,请指教!!
Flammable_ice 2014-04-21
  • 打赏
  • 举报
回复
引用 2 楼 buyong 的回复:
没看懂,太高深了
涉及到了多项式时间内求得k次方根的问题。也是我要解决的关键性问题。如果能在多项式时间内求得k次方根,那么这个问题在多项式时间内就有解了。
Flammable_ice 2014-04-21
  • 打赏
  • 举报
回复
引用 5 楼 wanren13 的回复:
没看懂楼主问的题目,写得更清楚点就好了 我第一想到的是用 log
哥们! 这个问题是topcoder上的问题,所以不太容易额。
Flammable_ice 2014-04-21
  • 打赏
  • 举报
回复
引用 6 楼 fetag 的回复:
此题无解。 如果n包含一个perfect power,则有 n = a * (b^k) 且 k > 1 and gcd (a, b) == 1. 那么求b只能用 n 除以从 2到 log n之间的所有素数,可是这个开销是EXP(β)级别的,假如 | n | = β。 从另一个角度考虑,假如有算法能在polynomial time内计算出来指数项,那也就可以在这个时间复杂度内找到n的一个factor了,那么“大数分解问题”就也能在polynomial time内解决了,可它是 NP-Hard的。
这个问题可以转换为在多项式时间内求k次方根如果有解。那么我就能写出这个问题的答案了。关键是C/C++编译器给的pow函数的时间复杂度是多少呢? 能否在多项式时间内完成呢? 感觉如果自己写这个函数,怎么写也没有系统给的好啊!
wanren13 2014-04-21
  • 打赏
  • 举报
回复
没看懂楼主问的题目,写得更清楚点就好了 我第一想到的是用 log
Flammable_ice 2014-04-21
  • 打赏
  • 举报
回复
质因子分解的方式《算法导论》书上已经给出,那我也会,但是貌似不满足题意啊
FancyMouse 2014-04-21
  • 打赏
  • 举报
回复
多项式肯定有。用质因子分解做说明你们方法错了。
lm_whales 2014-04-21
  • 打赏
  • 举报
回复
引用 12 楼 z84616995z 的回复:
O(2^β log ^2 β) 不是一个关于β的多项式时间
如果没有Olog(N)的因式分解算法,那么应该也没有,关于β的多项式时间算法.
千树之影 2014-04-21
  • 打赏
  • 举报
回复
做因式分解就行吧。因式分解应该是β的多项式时间。 然后O(β)个数求gcd应该也是多项式时间。
Flammable_ice 2014-04-21
  • 打赏
  • 举报
回复
引用 11 楼 lm_whales 的回复:
这里先假设β是8的倍数,n >=0,至于负数,取相反数,然后依照同样的方法计算,然后只要排除偶数次幂----即消除求出来的最大幂中的2因子就可以了. 1)分解质因数. 2)求各个因数次数的最大公约数. 这个最大公有数,就是最大的幂的次数. 如果最大公约数>=2, 那么一定是某个数的幂,如果是1 那么只是自己的1次幂而已. 不知道这个算法,是否在多项式时间内. 这个时间复杂度的计算,有点复杂; 估计要用到数学归纳法什么的; 分解质因数,不知道能不能有Olog(N)-->即<= O(β)的算法. 由于各因子的次数 <= β,所以每次gcd算法 < logβ 由于因子数<= β 所以gcd的计算次数 <= β 并且可以 优化到 <= logβ 那么 如果分解质因数可以Olog(N), 总的时间复杂度 O(β log ^2 β)<O(β ^2) 如果分解质因数只是O(N) = O(2^β) 那么,总的时间复杂度 O(2^β log ^2 β)
O(2^β log ^2 β) 不是一个关于β的多项式时间
lm_whales 2014-04-21
  • 打赏
  • 举报
回复
这里先假设β是8的倍数,n >=0,至于负数,取相反数,然后依照同样的方法计算,然后只要排除偶数次幂----即消除求出来的最大幂中的2因子就可以了. 1)分解质因数. 2)求各个因数次数的最大公约数. 这个最大公有数,就是最大的幂的次数. 如果最大公约数>=2, 那么一定是某个数的幂,如果是1 那么只是自己的1次幂而已. 不知道这个算法,是否在多项式时间内. 这个时间复杂度的计算,有点复杂; 估计要用到数学归纳法什么的; 分解质因数,不知道能不能有Olog(N)-->即<= O(β)的算法. 由于各因子的次数 <= β,所以每次gcd算法 < logβ 由于因子数<= β 所以gcd的计算次数 <= β 并且可以 优化到 <= logβ 那么 如果分解质因数可以Olog(N), 总的时间复杂度 O(β log ^2 β)<O(β ^2) 如果分解质因数只是O(N) = O(2^β) 那么,总的时间复杂度 O(2^β log ^2 β)
独孤过儿 2014-04-21
  • 打赏
  • 举报
回复
更正一个笔误,是 用 n 除以从 2到 sqrt(n) 之间的所有素数
独孤过儿 2014-04-21
  • 打赏
  • 举报
回复
此题无解。 如果n包含一个perfect power,则有 n = a * (b^k) 且 k > 1 and gcd (a, b) == 1. 那么求b只能用 n 除以从 2到 log n之间的所有素数,可是这个开销是EXP(β)级别的,假如 | n | = β。 从另一个角度考虑,假如有算法能在polynomial time内计算出来指数项,那也就可以在这个时间复杂度内找到n的一个factor了,那么“大数分解问题”就也能在polynomial time内解决了,可它是 NP-Hard的。
Flammable_ice 2014-04-20
  • 打赏
  • 举报
回复
引用 1 楼 yiyefangzhou24 的回复:
数字不大的话枚举就好了,从1-n
枚举的话 需要从2到根号n顺序查找,但是这起码就有o(根号n)的时间复杂度 那就等于O(2^(β/2))这样明显不是关于β的多项式时间额
Flammable_ice 2014-04-20
  • 打赏
  • 举报
回复
引用 2 楼 buyong 的回复:
没看懂,太高深了
网上查了。。以前在topcoder的SRM305出现过。但是我这个问题貌似要求更苛刻,需要在关于β位的多项式时间内判定。
buyong 2014-04-20
  • 打赏
  • 举报
回复
没看懂,太高深了
yiyefangzhou24 2014-04-20
  • 打赏
  • 举报
回复
数字不大的话枚举就好了,从1-n

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧