【发布时间】:2018-05-19 07:56:28
【问题描述】:
我们已经给出了两个整数 b 和 q,我们想要找到一个整数 'k' 的最小值,其中 q 完全整除 b^k 或者 k 不存在。我们能有效地找出k的值吗?不只是迭代 k (0, 1, 2, 3, ...) 的每个值并检查 (b^k) % q == 0) where q = k.
【问题讨论】:
标签: division integer-division greatest-common-divisor
我们已经给出了两个整数 b 和 q,我们想要找到一个整数 'k' 的最小值,其中 q 完全整除 b^k 或者 k 不存在。我们能有效地找出k的值吗?不只是迭代 k (0, 1, 2, 3, ...) 的每个值并检查 (b^k) % q == 0) where q = k.
【问题讨论】:
标签: division integer-division greatest-common-divisor
首先,k 永远不会等于 0,除非 q=1。 k 永远不会等于 1,除非 q=b。
接下来,如果你可以分解 q 和 b,那么你可以推理它们。
如果 b 的任何素因数根本不是 q 的因数,则 k 不存在。否则,k 必须足够大,以便 b^k 的每个因子都用 q 表示。
这是一些伪代码:
if (q==1) return 0;
if (q==b) return 1;
// qfactors and bfactors are arrays, one element per factor
let qfactors = prime_factorization(q);
let bfactors = prime_factorization(b);
let kmin=0;
foreach (f in bfactors.unique) {
let bcount = bfactors.count(f);
let qcount = qfactors.count(f);
if (qcount==0 || qcount < bcount) return -1; // k does not exist
kmin_f = ceiling(bcount/qcount);
if (kmin_f > kmin) let kmin = kmin_f;
}
return kmin;
【讨论】:
如果 q = 1 ; k = 0
如果 b = q ; k = 1
如果 b > q 和因素 ; k = 1
如果 b
如果 b != q 而不是因数; k != 我
我们知道, 股息 = 除数 x 商 + 提醒
=> 股息 = 除数 x 商 [这里,提醒 = 0]
现在计算最大值和最小值,因为商的值越低,“k”的值就越小。
如果您将商数视为 1(最小但 spl 大小写),那么您的“k”公式将变为,
k = log q/log b
【讨论】:
我找到了解决方案-
如果 q 除以 pow(b,k) 则 q 的所有素因数都是 b 的素因数。现在我们可以迭代 q = q ÷ gcd(b,q) 而 gcd(q,b)≠1。如果q≠1经过迭代,有q的素因数不是b的素因数
那么
k 不存在
else
k = 没有迭代。
【讨论】: