Last active
October 17, 2019 16:03
-
-
Save quickgrid/f506e3fbb470a07648bad7fe87482bdd to your computer and use it in GitHub Desktop.
C++ Class Object Oriented Fast Successive Sum Generation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Site: quickgrid.blogspot.com | |
* Any suggestions for faster or better implementation is welcome. | |
* 17-10-2019 removed personal headers, now the code will work directly. | |
*/ | |
#include<iostream> | |
using namespace std; | |
class SuccessiveSums { | |
public: | |
SuccessiveSums() { | |
} | |
~SuccessiveSums() { | |
} | |
int PRNG() | |
{ | |
static unsigned int nSeed = 3287; | |
nSeed = (9653748 * nSeed + 3497802); | |
return nSeed % 100; | |
} | |
int square(int v) { | |
if (v) { | |
v = (v < 0) ? -v : v; | |
int n = v >> 1; | |
if (v & 1) { | |
return ((square(n) << 2) + (n << 2) + 1); | |
} | |
else { | |
return (square(n) << 2); | |
} | |
} | |
return 0; | |
} | |
void generateSuccessiveSums(int* arr, int* storage_array, int N) { | |
// Generate Level 0 | |
for (int j = 1, i = 0; j < N; i = j, ++j) { | |
storage_array[i] = arr[i] + arr[j]; | |
} | |
int loop_limit = N - 1; | |
for (int k = 1; k < loop_limit; ++k) | |
{ | |
int tmp1 = N - k; | |
int tmp2 = k * N; | |
int tmp3 = tmp2 - N; | |
for (int j = 1, i = 0; j < tmp1; i = j, ++j) { | |
storage_array[tmp2 + i] = storage_array[tmp3 + i] + storage_array[tmp3 + j]; | |
} | |
} | |
} | |
void printSums(int v, int* storage_array, int N) { | |
int k = 0; | |
for (int i = 0; i < N; ++i) | |
{ | |
for (int i = 0; i < N; ++i) { | |
cout << storage_array[k++] << "\t"; | |
} | |
cout << "\n"; | |
} | |
} | |
}; | |
int main() { | |
SuccessiveSums* sum_generator = new SuccessiveSums(); | |
const int N = 7; | |
int* arr = new int[N]; | |
for (int i = 0; i < N; i++) | |
{ | |
arr[i] = sum_generator->PRNG(); | |
} | |
// For compact array | |
//int val = ((sum_generator->square(N) + (long long)N) >> 1); | |
int val = sum_generator->square(N); | |
cout << "SQUARE VALUE:" << val <<"\n\n"; | |
int* sum_holder = new int[val + (long long)1]; | |
for (int i = 0; i < N; ++i) { | |
for (int j = 0; j < N; ++j) { | |
sum_holder[i * N + j] = 0; | |
} | |
} | |
int* sum_holder1 = new int[val + (long long)1]; | |
sum_generator->generateSuccessiveSums(arr, sum_holder, N); | |
sum_generator->printSums(val, sum_holder, N); | |
delete sum_generator; | |
delete[] sum_holder; | |
delete[] arr; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment