Prima serata!

Mar 01 2023
Il mio amico Doug ha fatto una richiesta di funzionalità per l'orologio metrico solare: aggiungi un indicatore che ti dica quando l'ora visualizzata è un numero primo. Questo è in sintonia con la mia ossessione per i numeri primi e il mio desiderio di continuare a pasticciare con questo progetto all'infinito.

Il mio amico Doug ha fatto una richiesta di funzionalità per l' orologio metrico solare : aggiungi un indicatore che ti dica quando l'ora visualizzata è un numero primo. Questo è in sintonia con la mia ossessione per i numeri primi e il mio desiderio di continuare a pasticciare con questo progetto all'infinito.

Quindi ovviamente l'ho fatto.

Ho deciso di non considerare l'ora hh:mm come un singolo numero per questo scopo. Ore e minuti contano le quantità in modo diverso, quindi non sembra giusto considerarlo uno scalare. Ma sia il tempo solare che quello locale hanno senso come scalari.

Ho pensato di calcolare tutti i numeri primi inferiori al numero massimo visualizzabile (9999) all'avvio, salvarli in un vettore sparso e fare una rapida ricerca su richiesta per vedere se il tempo era primo. Doug e io abbiamo parlato dell'approccio. Ha ragionato che, se Elon dovesse apportare modifiche alla simulazione in cui viviamo tutti, allora i numeri primi potrebbero cambiare, quindi sarebbe più sicuro calcolarli all'accensione. Aveva senso.

Sfortunatamente, la mia scheda Arduino Uno Wifi Rev2 non ha memoria sufficiente per le strutture dati dell'algoritmo Sieve of Eratosthenes e per il vettore di ricerca che volevo utilizzare. Una delle cose interessanti della piattaforma di calcolo Arduino è che ha risorse limitate. Mi riporta a scrivere applicazioni sull'Apple II quando ero al liceo: devi prestare attenzione a rendere le cose piccole ed efficienti.

Si scopre che è possibile determinare la primalità di qualsiasi numero fino a 10.000 controllando la sua divisibilità per i numeri primi fino al primo primo dopo la radice quadrata di 10.000. Questo non è sufficiente per calcolare i fattori, solo per determinare la primalità. Non esporrò qui la teoria dei numeri perché è piuttosto divertente scoprirla da soli.

Ho codificato l'array [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79 , 83, 89, 97, 101] nell'orologio e verifica la divisibilità ogni volta che dipingo un tempo metrico su uno dei display a 4 cifre e 7 segmenti. Questo è in realtà piuttosto efficiente: metà dei numeri vengono eliminati testando contro 2 e così via.

Quando il tempo è primo, accendo il punto decimale che segue la cifra finale:

L'ora metrica locale è ottima!

Mi piace notare quando è la prima serata. Succede abbastanza spesso che sia l'ora metrica solare che quella locale visualizzate siano prime. Questa è una doppia scossa di endorfine numeriche!