【问题标题】:C++: How to find a and b from k = 2^a * b?C ++:如何从k = 2 ^ a * b中找到a和b?
【发布时间】:2020-09-30 04:55:51
【问题描述】:

在 C++ 中给出以下内容:

$$k = 2^a \cdot b,$$

只知道 k 的值并且 b 是奇数。如何找到 a 的值和 b 的值?

我确实考虑了以下几点:

  1. 如果 k 是奇数,a 必须为零,b 是 k
  2. 如果 k 是偶数,我会使用 for 循环遍历所有可能的 b,并检查是否 k % b == 0。如果是这种情况,我将采用 log2(k/b),如果这给了我返回一个整数,b = k/b 和 a = log2(b)。

我的问题:如何检查 log2(k/b) 是否返回整数?

C++ 代码:

Big k(9);
int r = 4;
int n = pow(2,r);
if (k % 2 == 1)
{
    a = 0;
    b = k;
}
else
{
    for (int b = 1; b < n; b += 2)
    {
        if (k % b == 0 && LOGARITHM OF k / b IS POSSIBLE)
        {
            a = log2(b);
        }
    }
}

顺便说一句:n 也给出了。除了 a 和 b 之外的所有东西都给出了。

【问题讨论】:

  • 考虑 2a 代表什么,并查看一些示例(k == 4 或 k == 6)。
  • 你能显示完整的代码吗? k是什么类型的?
  • k 的类型为 Big
  • @KuroiRyū 什么是“大”?
  • 关于pow 的快速说明:它对浮点数进行操作,而浮点数并不精确。你会发现你期望一个不错的整数,但却得到一个略高于或低于预期的数字。随着数字变大并且可表示数字之间的空间增加,这种差异变得越来越大。即使您管理接近预期的数字并将它们转换回整数,稍微低一点的数字也会被截断,你会结束减一。

标签: c++ algorithm math cryptography


【解决方案1】:

您可以执行以下操作:

int a = 0;
while (k % 2 == 0) {
  ++a;
  k /= 2;
}
int b = k;
// you have a, b

最好,将数字2**a*b除以2,直到不再是偶数,所以你找到了b

【讨论】:

    【解决方案2】:

    假设kunsigned int

    #include <bit>
    
    ...
    
    int a = std::countr_zero(k);
    unsigned int b = k >> a;
    

    【讨论】:

    • 它在 C++ 20 中,而 g++ 似乎还没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多