2013-08-04 21:40:54 +02:00
|
|
|
import math, random, itertools
|
|
|
|
import pyaudio
|
2013-07-15 15:34:50 +02:00
|
|
|
|
|
|
|
opzioni = {
|
2013-07-13 23:47:37 +02:00
|
|
|
"format": pyaudio.paFloat32,
|
|
|
|
"channels": 2,
|
|
|
|
"rate": 96000,
|
|
|
|
"input": True,
|
|
|
|
"frames_per_buffer": 1024
|
2013-07-15 15:34:50 +02:00
|
|
|
}
|
|
|
|
|
2013-08-25 20:06:00 +02:00
|
|
|
|
2013-07-15 15:34:50 +02:00
|
|
|
class primi:
|
2013-08-25 20:06:00 +02:00
|
|
|
|
2013-12-06 19:57:11 +01:00
|
|
|
def primo(n, k=64):
|
2013-08-04 21:40:54 +02:00
|
|
|
"""
|
2013-12-06 19:57:11 +01:00
|
|
|
Test di primalità probabilistico Miller-Rabin.
|
2013-08-04 21:40:54 +02:00
|
|
|
Restituisce True se n è primo altrimenti restituisce False.
|
2013-12-09 22:20:36 +01:00
|
|
|
La probabilità che sia sbagliato è 2^-2k
|
2013-08-04 21:40:54 +02:00
|
|
|
"""
|
2013-12-09 22:20:36 +01:00
|
|
|
if n < 2 or n % 2 == 0:
|
|
|
|
return False
|
2013-12-06 19:57:11 +01:00
|
|
|
if n == 2:
|
|
|
|
return True
|
|
|
|
|
2013-12-09 22:20:36 +01:00
|
|
|
r, s = 0, n - 1
|
|
|
|
while s % 2 == 0:
|
|
|
|
r += 1
|
|
|
|
s //= 2
|
2013-12-06 19:57:11 +01:00
|
|
|
|
|
|
|
for i in range(k):
|
|
|
|
a = random.randrange(2, n)
|
2013-12-09 22:20:36 +01:00
|
|
|
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
|
2013-08-25 20:06:00 +02:00
|
|
|
|
2013-12-06 19:57:11 +01:00
|
|
|
def primi(p, n):
|
2013-08-04 21:40:54 +02:00
|
|
|
"""
|
2013-12-06 19:57:11 +01:00
|
|
|
Restituisce gli n numeri primi succesivi a p.
|
|
|
|
[Generatore]
|
2013-08-04 21:40:54 +02:00
|
|
|
"""
|
2013-12-09 22:20:36 +01:00
|
|
|
if p == 2:
|
|
|
|
n -= 1
|
|
|
|
yield p
|
2013-12-06 19:57:11 +01:00
|
|
|
if p % 2 == 0:
|
|
|
|
p += 1
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
if i == n:
|
|
|
|
break
|
|
|
|
if primi.primo(p):
|
|
|
|
i += 1
|
|
|
|
yield p
|
|
|
|
p += 2
|
2013-07-15 15:34:50 +02:00
|
|
|
|
2013-08-25 20:06:00 +02:00
|
|
|
|
2013-07-15 15:34:50 +02:00
|
|
|
class generatore:
|
2013-08-25 20:06:00 +02:00
|
|
|
|
2013-08-04 21:40:54 +02:00
|
|
|
def caso(inizio, fine, n):
|
|
|
|
"""
|
|
|
|
Restituisce n interi casuali nell'intervallo [inizio; fine).
|
|
|
|
[Generatore]
|
|
|
|
"""
|
2013-01-05 01:20:04 +01:00
|
|
|
audio = pyaudio.PyAudio()
|
2013-07-13 23:47:37 +02:00
|
|
|
input = audio.open(**opzioni)
|
2013-12-09 22:20:36 +01:00
|
|
|
dati = input.read(
|
|
|
|
opzioni["rate"] //
|
|
|
|
opzioni["frames_per_buffer"] *
|
|
|
|
int(math.log(n)) + 500
|
|
|
|
)
|
2013-01-05 01:20:04 +01:00
|
|
|
input.close()
|
|
|
|
audio.terminate()
|
|
|
|
dati = [i for i in dati if i != 0]
|
2013-08-25 20:06:00 +02:00
|
|
|
dati = [i for i in dati if i in range(inizio, fine)]
|
2013-07-13 23:47:37 +02:00
|
|
|
random.shuffle(dati)
|
2013-08-04 21:40:54 +02:00
|
|
|
for i in range(n):
|
2013-07-13 23:47:37 +02:00
|
|
|
yield dati[i]
|
2013-07-15 15:34:50 +02:00
|
|
|
|
|
|
|
def onetimepad(l):
|
2013-08-04 21:40:54 +02:00
|
|
|
"""
|
|
|
|
Ritorna una l-tupla di interi casuali per un one-time-pad.
|
|
|
|
"""
|
2013-08-25 20:06:00 +02:00
|
|
|
return tuple(generatore.caso(0, 2 * 16, l))
|