C++ 💫#
Just the translation from python, really easy
CMakeLists.txt#
Windows#
cmake_minimum_required(VERSION 3.27)
project(InteropFibonacciWinCPP)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /arch:AVX2")
add_library(InteropFibonacciWinCPP SHARED library.cpp)
Linux#
cmake_minimum_required(VERSION 3.27)
project(InteropFibonacciWinCPP)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -march=native")
add_library(InteropFibonacciWinCPP SHARED library.cpp)
Prologue#
#include <cmath>
#include <string>
enum class fbReturn {
OK, TMT, TB, PRM_ERR
};
Prime number ?#
bool isPrime(unsigned long long numberPrime, unsigned long long maxFactor) {
int maxSearch = (numberPrime < maxFactor) ? numberPrime : maxFactor;
for (unsigned long long i = 2; i < maxSearch; ++i) {
if (numberPrime % i == 0)
return false;
} return true;
}
Do Factorization#
void factorization(unsigned long long* arTerms, bool* arPrimes, int baseIndex, unsigned long long maxFactor) {
int position = 0;
unsigned long long result = arTerms[baseIndex];
unsigned long long testNbr = 2;
while (result != 1) {
if (result % testNbr == 0) {
position += 1;
arTerms[baseIndex + position] = testNbr;
arPrimes[baseIndex + position] = isPrime(testNbr, maxFactor);
result /= testNbr;
if (position == 49)
break;
continue;
} testNbr += 1;
if (testNbr > maxFactor)
break;
}}
The test#
extern "C" __declspec(dllexport) fbReturn fibonacci_interop_cpp(unsigned long long fbStart, unsigned char maxTerms, unsigned long long maxFibo, unsigned long long maxFactor, unsigned char nbrOfLoops,
unsigned long long* arTerms, bool* arPrimes, double* arError, double& goldenNbr) {
if (fbStart < 1 || maxFibo < 1 || maxTerms < 3 || maxFactor < 2 || nbrOfLoops < 1)
return fbReturn::PRM_ERR;
if (maxTerms > 93)
return fbReturn::TMT;
if (maxFibo > 18446744073709551615)
return fbReturn::TB;
if (maxFactor > 18446744073709551615)
return fbReturn::TB;
goldenNbr = (1 + sqrt(5)) / 2;
unsigned long long nextValue;
for (int loop = 0; loop < nbrOfLoops; ++loop) {
std::fill_n(arTerms, maxTerms * 50, 0);
arTerms[0] = arTerms[50] = fbStart;
std::fill_n(arPrimes, maxTerms * 50, false);
std::fill_n(arError, maxTerms, 0.0);
factorization(arTerms, arPrimes, 0, maxFactor);
factorization(arTerms, arPrimes, 50, maxFactor);
for (int currentTerm = 2; currentTerm < maxTerms; ++currentTerm) {
int baseIndex = currentTerm * 50;
nextValue = arTerms[baseIndex - 50] + arTerms[baseIndex - 100];
if (nextValue > maxFibo)
return fbReturn::OK;
arTerms[baseIndex] = nextValue;
arPrimes[baseIndex] = isPrime(arTerms[baseIndex], maxFactor);
arError[currentTerm] = abs(goldenNbr - (arTerms[baseIndex]) / arTerms[baseIndex - 50]);
factorization(arTerms, arPrimes, baseIndex, maxFactor);
} }
return fbReturn::OK;
}