Wednesday, September 18, 2019
C++ Class Object Oriented Fast Successive Sum Generation
September 18, 2019
c++
,
class
,
fast bit shift square
,
fast successive sum generation
,
flat 2d array
,
memory deallocation
,
oop
,
PRNG
,
pseudo random number generator
Creates a matrix where every row is sum of previous row's two immediate elements.
Code:
This file contains 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; | |
} |
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment