Skip to content

Commit

Permalink
adaptation STM32F411 for 2E32 calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
kreier committed Dec 16, 2023
1 parent 3443fdd commit a7a92ed
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 38 deletions.
67 changes: 29 additions & 38 deletions arduino/v5.3/prime_logging_stm32f411/prime_logging_stm32f411.ino
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
/* Prime numbers in Arduino C v5.3 2023/12/14 for esp32-s2 */
/* Prime numbers in Arduino C v5.4 2023/12/14 for STM32F411CEU6 */
#include <time.h>
#include <math.h>

#include <EEPROM.h>

double start;
int column = 10;
int found = 4; // we already know 2, 3, 5, 7
int divisors = found;
int primes[3400] = {3, 5, 7};
int led = 15; // LED_BUILDIN
uint32_t primes[6550] = {3, 5, 7};
int led = 13; // LED_BUILTIN


int is_prime(int number) {
int is_prime(uint32_t number) {
int prime = 1;
for (int divider = 3; divider < (int)(sqrt(number)) + 1; divider += 2)
{
Expand All @@ -24,8 +24,8 @@ int is_prime(int number) {
return prime;
}

int find_primes(int limit) {
for(int number=11; number < limit + 1; number += 2) {
int find_primes(uint32_t limit) {
for(uint32_t number=11; number < limit + 1; number += 2) {
if( is_prime(number) == 1) {
primes[found - 1] = number;
found++;
Expand All @@ -36,15 +36,11 @@ int find_primes(int limit) {
return 1;
}

int is_prime_fast(int number) {
int largest_divider = (int)(sqrt(number));
int is_prime_fast(uint32_t number) {
uint32_t largest_divider = (int)(sqrt(number));
int flag_prime = 1;
// Serial.print(number);
// Serial.print(" - ");
for(int i=0; i < divisors; i++)
{
// Serial.print(primes[i]);
// Serial.print(" ");
if(number % primes[i] == 0)
{
flag_prime = 0;
Expand All @@ -55,7 +51,6 @@ int is_prime_fast(int number) {
break;
}
}
// Serial.print("\n");
return flag_prime;
}

Expand All @@ -79,37 +74,35 @@ void setup() {
Serial.print(".");
delay(1000);
}
const int scope[] = {100, 1000, 10000, 100000, 1000000, 10000000, 25000000, 100000000, 1000000000};
const int reference[] = {25, 168, 1229, 9592, 78498, 664579, 1565927, 5761455, 50847534};
const uint32_t scope[] = {100, 1000, 10000, 100000, 1000000, 10000000, 25000000, 100000000, 1000000000, 2147483647, 4294967295 };
const int reference[] = {25, 168, 1229, 9592, 78498, 664579, 1565927, 5761455, 50847534, 105097564, 200000000};

// previous run
const char* pref[] = {"p100", "p1000", "p10000", "p100000", "p1000000", "p10000000", "p25000000", "p100000000", "p1000000000"};
// Preferences preferences;
// preferences.begin("prime", true);
Serial.print("\nGet previous results for this ESP32-S2:\n");
Serial.print("\nGet previous results for this STM32F411CEU6:\n");
Serial.print(" last seconds \n");
for(int i = 0; i < 9; i++) {
int spaces = 11 - (int)log10(scope[i]);
for(int i = 0; i < 11; i++) {
int spaces = 12 - (int)log10(scope[i]);
for(int j = 0; j < spaces; j++) {
Serial.print(" ");
}
Serial.print(scope[i]);
Serial.print(" ");
// Serial.print(preferences.getFloat(pref[i], 0), 6);
float last_time;
EEPROM.get(i * 4 + 1, last_time);
Serial.print(last_time, 6);
Serial.print("\n");
}
// preferences.end();

// start calculating
for (int i = 0; i < 9; i++) // 9
for (int i = 0; i < 11; i++)
{
int last = scope[i];
found = 4; // we already know 2, 3, 5, 7
Serial.println("\n\nPrime v5.0 in Arduino C - 2023/12/14");
Serial.println("\n\nPrime v5.4 in Arduino C - 2023/12/16");
Serial.print("Calculating prime numbers until ");
Serial.println(last);
start = micros(); // use micros() for more precision
// Serial.println(start/1000000, 6);
// start = millis();
start = micros(); // use micros() for more precision in runtimes < 70 minutes
int largest_divider = (int)(sqrt(last));
if(largest_divider % 2 == 0)
{
Expand All @@ -123,7 +116,7 @@ void setup() {
Serial.print(" to use as divisors.\n");
int dot = millis();
int column = 0;
for(int number = largest_divider + 2; number < last; number += 2)
for(uint32_t number = largest_divider + 2; number < last; number += 2)
{
found += is_prime_fast(number);
if((millis() - dot) > 1000) {
Expand All @@ -139,7 +132,7 @@ void setup() {
}
if(column > 40) {
column = 0;
elapsed_time(dot/1000);
elapsed_time((millis()-start)/1000);
Serial.print(" - ");
Serial.print(number);
Serial.print(" ");
Expand All @@ -148,7 +141,8 @@ void setup() {
}
}
}
float duration = (micros() - start)/1000000;
// float duration = (millis() - start)/1000;
float duration = (micros() - start)/1000000; // use micros() for more precision in runtimes < 70 minutes
if(duration > 2) {
Serial.print("\n");
}
Expand All @@ -160,21 +154,18 @@ void setup() {
Serial.print(duration, 6);
Serial.print(" seconds.");
elapsed_time(duration);
// preferences.begin("prime", false);
// preferences.putFloat(pref[i], duration);
// preferences.end();
EEPROM.put(i * 4 + 1, duration);
}
// preferences.end();
Serial.print("\n");
}

void loop() { // program finished, just keep printing some dots
for(int i = 0; i < 80; i++) {
Serial.print(".");
for(int x = 0; x < 100; x++) {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(20); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
digitalWrite(led, HIGH);
delay(20);
digitalWrite(led, LOW);
delay(30);
}
}
Expand Down
19 changes: 19 additions & 0 deletions arduino/v5.3/results_st,32f411.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Calculating prime numbers in Arduino C v5.4.2023
2023/12/16
STM32F411CEU6 with 100 MHz

last time in seconds
100 0.000644
1,000 0.006408
10,000 0.066512
100,000 0.722038
1,000,000 8.475698
10,000,000 114.404968
25,000,000 338.672211
100,000,000 1851.313477
1,000,000,000 36123.051 or 10h 2min 3s
2,417,483,647
4,294,967,295



0 comments on commit a7a92ed

Please sign in to comment.