我目前正在从事一个涉及大量迭代的项目(准确地说是 2^32)。在我的大部分计算中,我主要使用mathematica,但它无法处理那种数量的过程。有人建议我c++可以处理它,所以昨晚我学习了c++并编写了以下代码:
//old code
代码运行良好,(我检查了较小的参数)但我已经开始运行它 4294967295 = 2^32-1 步骤,我认为这需要数百个小时。如果有人能告诉我是否有办法优化此代码的某些部分以使其运行得更快,我将不胜感激?我对这种语言没有经验,所以我如何构造函数可能看起来很混乱。我认为我的 Ca2step 函数运行得非常有效(我可能错了),而且我认为我在主要部分中的循环正在减慢一切。我认为必须有更快的方法来完成我想要完成的工作,所以任何帮助都会很棒。谢谢,理查德。
======= 更新 ========
非常感谢大家,我真的很感激。好的,这对我来说都是新事物,所以我发现很难理解某些事情的含义。下面是我更新的代码。但是我觉得它仍然很慢。有些人建议“并行化”,但我不知道这是什么以及我会怎么做?再次感谢,理查德。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//parameters
int a[32] = {0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,
1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1};
int b[32] = {1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1,
1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
// Create vector of vectors from arrays to be input into function.
vector<int> va (a, a + sizeof(a) / sizeof(int) );
vector<int> vb (b, b + sizeof(b) / sizeof(int) );
vector< vector<int> > ca2step (long int r, vector< vector<int> > vec)
{
int rulearray[32] = { 0 };
for (int pos = 31; pos >= 0; --pos){
if (r % 2)
rulearray[pos] = 1;
r /= 2;
}
int arraya[32] = {0};
int arrayb[32] = {0};
for (int i = 0; i < 32; i++) {
arraya[i] = vec[0][i];
arrayb[i] = vec[1][i];
}
vector< vector<int> > output;
typedef int t_array[32];
t_array vll, vl, vr, vrr, vx;
rotate_copy(arrayb,arrayb+2,arrayb+32,vll);
rotate_copy(arrayb,arrayb+1,arrayb+32,vl);
rotate_copy(arrayb,arrayb+31,arrayb+32,vr);
rotate_copy(arrayb,arrayb+30,arrayb+32,vrr);
for (int i = 0; i < 32; i++) {
vx[i] = (arraya[i] + rulearray[(31 - (vll[i] + (2 * vl[i])
+ (4 * arrayb[i]) + (8 * vr[i]) + (16 * vrr[i])))]) % 2;
}
output.push_back(vector<int>(arrayb, arrayb+32));
output.push_back(vector<int>(vx, vx+32));
return (output);
}
int caevolve ( long int r, vector< vector<int> > vector ){
int count;
for(int j=0; j<20; j++){
//run function
vector = ca2step(r, vector);
}
if (vector[0] == va || vector[1] == va) {
count = 1;
}
else{
count=0;
}
return (count);
}
int main ()
{
vector< vector<int> > vinput;
vinput.reserve(32);
vinput.push_back(va);
vinput.push_back(vb);
int counter = 0;
for(unsigned long long int i=0;i<4294967295;i++){ //4294967295
counter += caevolve(i, vinput);
}
cout<< "Counter : " << counter << endl;
return 0;
}