Loops 如何处理从0到2^95的循环?

Loops 如何处理从0到2^95的循环?,loops,Loops,我的问题如下: 我必须迭代95个元素的所有可能性(0或1) 例如,如果有2个元素,则可能性为: 00,01,10,11 总可能性的数量为2^n,因此增长非常快。 2^95=39614081257132168796771975168 如何有效地从0迭代到2^95 P.S.S.编程语言的选择并不重要,但我猜C或C++应该是最快的选择。 p.p.S.我认为,由于BigInt实现似乎比基元类型慢得多,所以最好将数量分成X个基元。不过,到目前为止,我运气不好 p.p.S.我有一个函数,通过提供一个从0到2

我的问题如下:

我必须迭代95个元素的所有可能性(0或1)

例如,如果有2个元素,则可能性为: 00,01,10,11

总可能性的数量为2^n,因此增长非常快。 2^95=39614081257132168796771975168

如何有效地从0迭代到2^95

P.S.S.编程语言的选择并不重要,但我猜C或C++应该是最快的选择。 p.p.S.我认为,由于BigInt实现似乎比基元类型慢得多,所以最好将数量分成X个基元。不过,到目前为止,我运气不好


p.p.S.我有一个函数,通过提供一个从0到2^95的数字来产生可能性,现代CPU运行频率为几千兆赫兹,因此您可以每秒迭代10亿个值(如果您没有做太多其他工作的话)

以每秒10亿次迭代的速度,需要1.2万亿年才能达到295次迭代


你需要找到一种不同的方法来做你正在做的任何事情。

除非你有一台量子计算机,否则你无法逃避对整个范围的迭代。最简单的方法是将95位分割成一组原语。例如,如果您的系统使用64位数字运行,则可以使用其中的2位。 伪代码如下所示:

lowBound <-- 2^64-1
highBound <-- 2^31-1
for highIdx = 0 up to highBound
    for lowIdx = 0 up to lowBound
         ; Do your thing here, if you need the actual index,
         ; it's combinable from lowIdx and highIdx
// where UInt128 is your big integer type
// cast the high word to prevent overflow

UInt128 word = (UInt128)high << 64 | low;
lowBound理论上,以下是您要做的:

int exp = 95;

UInt64 hmax = 2 ^ (exp - 64);
UInt64 lmax = 2 ^ 63 + (2 ^ 63 - 1);

for (UInt64 high = 0; high < hmax; high++) {
    for (UInt64 low = 0; low <= lmax; low++) {

        // do stuff

    }
}
或者将它们连接为字符串

循环模式如下所示(使用字节表示):


我的猜测是,你需要量子比特()来做你的计算,但由于它们本质上是理论的,也许你最好现在就开始迭代,看看它是否会更快,或者量子计算会很快得到你的答案

使用量子计算,你可以一次测试所有的组合


从这里开始阅读,它可能无法解决您的问题,但它确实很有趣:

您的CPU型号是什么?我喜欢您,您很有趣。您需要如何处理这些数字?这似乎是问题的一个相当基本的方面。你想要一个他们都在里面的文件吗?是否需要将它们依次传递给其他库或程序?“我认为,由于BigInt实现似乎比基本类型慢得多,”你真的很有趣。1GHz的CPU周期持续1纳秒。问你自己这个问题:2^95纳秒代表多少时间?“91*宇宙时代”,感谢你在initialization@icepack是的,你说得对。更正了。现在开始计算没有任何好处。我预计,在未来的十年内,硬件的改进将使预期运行时间缩短十年以上,因此更好的策略是静观其变。(计算理想的起点很有意思,但你必须对硬件改进的速度做出一些假设;不清楚摩尔定律是否会无限期地成立。)哈哈,太好了!我想这就是我应该开始(和结束)的地方。谢谢你指出这一点!
00000000 00000000
00000000 00000001
00000000 00000010

and eventually you get to

00000000 11111111

inner loop completes and it goes to

00000001 00000000
00000001 00000001