有效地计算整数n

时间:2016-02-23 23:14:03

标签: java decomposition

我在设计将整数n表示为整数对(基数,指数)的方法时遇到问题,因此n == base ^ exponent用于赋值。以下是该方法的合同。 @pre指定 n 必须是什么,@ post定义输出必须是什么。

/**
* Writes a number as a power with maximal exponent.
*
* @param n  the number to 'powerize'
* @return  power decomposition of {@code n} with maximal exponent
* @throws IllegalArgumentException  if precondition violated
* @pre {@code 2 <= n}
* @post {@code n == power(\result) &&
*     (\forall int b, int e;
*      2 <= b && 1 <= e && n == b ^ e;
*      e <= \result.exponent)}
*/
public static Power powerize(int n){}

Power类只是一个Pair实例。

我已经设法使用一种天真的方法来解决这个问题,我通过用log(n) / log(b)计算2 <= b <= sqrt(n)来计算基数和指数的值。但作业描述说我必须制作一个优雅的&amp;有效的方法,我无法找到一种更有效地计算它的方法。

1 个答案:

答案 0 :(得分:0)

在咨询了一些书之后,我设计了以下解决方案:

输入int n
p 1 ... p m 是唯一的素数。
然后我们可以将 n 表达为:

    n = p 1 e 1 x ... xp m e <子>米

然后使用欧几里德算法计算e 1 ... e m 的gcd d
然后我们将n表示为:

    n =(p 1 e 1 / d x ... xp m < sup> e m / d ) d

现在我们有:

    b = p 1 e 1 / d x ... xp m e m / d
    e = d
返回新的力量(b,e)