【问题标题】:How to find the value of integer k efficiently for which q divides b ^ k finitely?如何有效地找到整数 k 的值,其中 q 有限地除 b ^ k?
【发布时间】: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


    【解决方案1】:

    首先,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;
    

    【讨论】:

    • 您的解决方案很好,但我认为对于较大的 b 或 q 值,它会面临素数分解问题。
    【解决方案2】:

    如果 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

    【讨论】:

      【解决方案3】:

      我找到了解决方案-
      如果 q 除以 pow(b,k)q 的所有素因数都是 b 的素因数。现在我们可以迭代 q = q ÷ gcd(b,q)gcd(q,b)≠1。如果q≠1经过迭代,有q的素因数不是b的素因数
      那么
      k 不存在
      else
      k = 没有迭代

      【讨论】:

        猜你喜欢
        • 2013-12-31
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 2019-08-29
        • 2020-11-08
        • 2017-01-29
        • 2011-04-27
        • 1970-01-01
        相关资源
        最近更新 更多