e88bad83f8
* Completata corretamente la fattorizzazione dei numeri di Gödel * Corretto un errore nell’algoritmo del test di primalità * Corretto un un problema con l’input del microfono (lo stream si chiudeva prima di aver effetttivamente registrato)
91 lines
1.6 KiB
Python
91 lines
1.6 KiB
Python
import math, random, itertools
|
|
import pyaudio
|
|
|
|
opzioni = {
|
|
"format": pyaudio.paFloat32,
|
|
"channels": 2,
|
|
"rate": 96000,
|
|
"input": True,
|
|
"frames_per_buffer": 1024
|
|
}
|
|
|
|
|
|
class primi:
|
|
|
|
def primo(n, k=64):
|
|
"""
|
|
Test di primalità probabilistico Miller-Rabin.
|
|
Restituisce True se n è primo altrimenti restituisce False.
|
|
La probabilità che sia sbagliato è 2^-2k
|
|
"""
|
|
if n < 2 or n % 2 == 0:
|
|
return False
|
|
if n == 2:
|
|
return True
|
|
|
|
r, s = 0, n - 1
|
|
while s % 2 == 0:
|
|
r += 1
|
|
s //= 2
|
|
|
|
for i in range(k):
|
|
a = random.randrange(2, n)
|
|
x = pow(a, s, n)
|
|
if x == 1 or x == n - 1:
|
|
continue
|
|
for i in range(r - 1):
|
|
x = pow(x, 2, n)
|
|
if x == n - 1:
|
|
break
|
|
else:
|
|
return False
|
|
return True
|
|
|
|
def primi(p, n):
|
|
"""
|
|
Restituisce gli n numeri primi succesivi a p.
|
|
[Generatore]
|
|
"""
|
|
if p == 2:
|
|
n -= 1
|
|
yield p
|
|
if p % 2 == 0:
|
|
p += 1
|
|
i = 0
|
|
while True:
|
|
if i == n:
|
|
break
|
|
if primi.primo(p):
|
|
i += 1
|
|
yield p
|
|
p += 2
|
|
|
|
|
|
class generatore:
|
|
|
|
def caso(inizio, fine, n):
|
|
"""
|
|
Restituisce n interi casuali nell'intervallo [inizio; fine).
|
|
[Generatore]
|
|
"""
|
|
audio = pyaudio.PyAudio()
|
|
input = audio.open(**opzioni)
|
|
dati = input.read(
|
|
opzioni["rate"] //
|
|
opzioni["frames_per_buffer"] *
|
|
int(math.log(n)) + 500
|
|
)
|
|
input.close()
|
|
audio.terminate()
|
|
dati = [i for i in dati if i != 0]
|
|
dati = [i for i in dati if i in range(inizio, fine)]
|
|
random.shuffle(dati)
|
|
for i in range(n):
|
|
yield dati[i]
|
|
|
|
def onetimepad(l):
|
|
"""
|
|
Ritorna una l-tupla di interi casuali per un one-time-pad.
|
|
"""
|
|
return tuple(generatore.caso(0, 2 * 16, l))
|