【问题标题】:finding power of a number寻找数字的力量
【发布时间】:2014-03-02 06:08:54
【问题描述】:

我有一个非常大的数字,它是几个小素数的乘积。我知道数字,也知道主要因素,但我不知道它们的力量。例如:

(2^a)x(3^b)x(5^c)x(7^d)x(11^e)x .. = 2310

现在我想以非常快速有效的方式恢复指数。我想在 FPGA 中实现它。

问候,

【问题讨论】:

  • 欢迎来到 SO。请向我们展示您对解决方案的尝试。我们不是来为您工作的。
  • 我尝试过的是将数字除以其素数迭代地单位l我得到一个分数。然后我将计算每个赋予我权力的因素的划分数量。但是当我提到的产品变得非常庞大时,这是不切实际的。
  • 如果您将 2310 除以 2 的次数超过 'a' 次,您最终会得到一些分数。但直到'a',你会得到0个分数。所以计数会有所帮助,但它太慢了。
  • 为什么要在FPGA中实现?

标签: fpga exponential factorization


【解决方案1】:

问题在于,当您应该进行二分搜索时,您正在为正确的幂进行线性搜索。下面是一个示例,说明如何处理 p 的幂为 10 (p^10) 的情况。此方法以 O(log N) 的除法计算幂,而不是 O(N)。

首先通过快速增加功率直到它太高来找到上限,这发生在第 5 步。然后它使用二进制搜索来找到实际功率。

  1. 检查可除性由 p。有效。
  2. 检查是否被 p^2 整除。有效。
  3. 检查是否被 p^4 整除。有效。
  4. 检查 p^8 的整除性。有效。
  5. 检查 p^16 的整除性。不工作。撤消/忽略这个。
  6. 通过 p^((8+16)/2)=p^12 检查整除性。不工作。撤消/忽略这个。
  7. 通过 p^((8+12)/2)=p^10 检查整除性。有效,但可能太低了。
  8. 通过 p^((10+12)/2)=p^11 检查整除性。不工作。撤消/忽略这个。
  9. 由于 ((10+11)/2)=10.5 不是整数,所以最大的幂是低端,即 10。

注意,有一种方法实际上是除以 p,在第 4 步,实际上是除以 p^(1+2+4+8)=p^15,但它有点多很难解释二分查找部分。但是,被除数的大小越来越小,因此除法运算速度更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多