Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python位求和算法_Python 3.x_Algorithm_Math_Bit_Bits - Fatal编程技术网

Python 3.x Python位求和算法

Python 3.x Python位求和算法,python-3.x,algorithm,math,bit,bits,Python 3.x,Algorithm,Math,Bit,Bits,我正在尝试实现一个函数,该函数将用于判断发电机的输出是否连续。我喜欢的方法是遍历生成器。对于每个值,我右对齐值的位(忽略0b),计算一个数,并移动一个数 #!/usr/bin/python3 from typing import Tuple def find_bit_sum(top: int, pad_length: int) -> int : """.""" return pad_length * (top + 1) def find_pad_length(top

我正在尝试实现一个函数,该函数将用于判断发电机的输出是否连续。我喜欢的方法是遍历生成器。对于每个值,我右对齐值的位(忽略
0b
),计算一个数,并移动一个数

#!/usr/bin/python3
from typing import Tuple


def find_bit_sum(top: int, pad_length: int) -> int :
    """."""
    return pad_length * (top + 1)


def find_pad_length(top: int) -> int :
    """."""
    return len(bin(top)) - 2  # -"0b"


def guess_certain(top: int, pad_length: int) -> Tuple[int, int, int] :
    """."""
    _both: int = find_bit_sum(top, pad_length)
    _ones: int = sum(sum(int(_i_in) for _i_in in bin(_i_out)[2 :]) for _i_out in range(1, top + 1))
    return _both - _ones, _ones, _both  # zeros, ones, sum


def guess(top: int, pad_length: int) -> Tuple[int, int, int] :  # zeros then ones then sum
    """."""
    _bit_sum: int = find_bit_sum(top, pad_length)  # number of bits in total
    _zeros: int = _bit_sum  # ones are deducted
    _ones: int = 0  # _bit_sum - _zeros
    # detect ones
    for _indexed in range(pad_length) :
        _ones_found: int = int(top // (2 ** (_indexed + 1)))  # HELP!!!
        _zeros -= _ones_found
        _ones += _ones_found
    #
    return _zeros, _ones, _bit_sum


def test_the_guess(max_value: int) -> bool :  # the range is int [0, max_value + 1)
    pad: int = find_pad_length(max_value)
    _zeros0, _ones0, _total0 = guess_certain(max_value, pad)
    _zeros1, _ones1, _total1 = guess(max_value, pad)
    return all((
        _zeros0 == _zeros1,
        _ones0 == _ones1,
        _total0 == _total1
    ))


if __name__ == '__main__' :  # should produce a lot of True
    for x in range(3000) :
        print(test_the_guess(x))
就我的一生而言,我不能让
guess()
同意
guess\u-suite()
。我的问题是,
guess\u-soute()
的时间复杂性:它适用于小范围
[0,top]
,但人们可能会忘记256位数字(
top
s)。
find\u bit\u sum()
函数工作正常。
find\u pad\u length()
函数也可以工作

top // (2 ** (_indexed + 1))
我尝试了40或50种
guess()
函数的变体。这使我彻底失望。
guess()
函数是概率函数。在完成状态下:如果返回
False
,那么生成器肯定不会生成
范围(top+1)
中的所有值;但是,如果它返回
True
,则生成器可能无法运行。我们已经知道生成器
范围(top+1)
是连续的,因为它确实生成
0
top
之间的每个数字;因此,
test\u猜测()
应该返回
True


我真诚地为混乱的解释道歉。如果您有任何疑问,请随时提问。

我调整了您的
查找到的
赋值语句,以说明每
int(top//(2**(\u index+1)))的二次幂数。
,以及在下一次二次幂之前发生的额外“滚动”二次幂数。结果如下:

_ones_found: int = int(top // (2 ** (_indexed + 1))) * (2 ** (_indexed)) + max(0, (top % (2 ** (_indexed + 1))) - (2 ** _indexed) + 1)
为了清晰和快速,我还自由地将语句转换为位运算符,如下所示:

_ones_found: int = ((top >> _indexed + 1) << _indexed) + max(0, (top & (1 << _indexed + 1) - 1) - (1 << _indexed) + 1)

\u-ones\u-found:int=((顶部>>\u-indexed+1)这是一个奇怪的连续性定义,它通常被定义为连续值之间的差异很小。
1.0
1-2**-50
之间的差异很小,但是
1
位的数量非常大。你可以说
2**50
2**50-1
也是如此令人惊讶的观察,@RoryDaulton。我不知道该如何给这个想法贴上标签。谢谢。非常感谢!你是怎么做到的?我的错误有多愚蠢?我遗漏了什么?你怎么这么快就发现了?AidanCodeX首先我检查了极端案例-0b1000…和0b00…1,看到前者被大量删除,发现你需要修改乘以你除以的2的幂的1/2,否则你就失去了那个“群体”.我打印了这些差异,看到它们现在是低100而不是高1000。然后我推断我需要注意在除法过程中丢失的位,并将其归结为差异,我不认为这是一个愚蠢的错误-我花了一段时间自己弄明白。有两个部分-你必须乘以1/2的数量你除以(地板铺设后),否则你会损失除一个以外的所有1。然后在考虑这些因素后,你仍然需要考虑两个最大幂以上的1。这就是“最大(…)部分所做的。