現在、多数の反復 (正確には 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;
}