crypto/crittografia/numeri.py

66 lines
1.3 KiB
Python
Raw Normal View History

2013-08-04 21:40:54 +02:00
import math, random, itertools
import pyaudio
2013-07-15 15:34:50 +02:00
opzioni = {
"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-07-15 15:34:50 +02:00
def primo(n):
2013-08-04 21:40:54 +02:00
"""
Restituisce True se n è primo altrimenti restituisce False.
"""
2013-08-25 20:06:00 +02:00
for i in range(3, int(math.sqrt(n)) + 1, 2):
2013-07-15 15:34:50 +02:00
if n % i == 0:
return False
return True
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def prossimo(n):
2013-08-04 21:40:54 +02:00
"""
2013-08-25 20:06:00 +02:00
Restituisce il più piccolo numero primo maggiore di n.
2013-08-04 21:40:54 +02:00
[Generatore]
"""
2013-08-25 20:06:00 +02:00
if n % 2 == 0:
2013-08-04 21:40:54 +02:00
n += 1
2013-07-15 15:34:50 +02:00
while True:
n += 2
2013-08-25 20:06:00 +02:00
if primi.primo(n):
2013-07-15 15:34:50 +02:00
yield n
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def lista(p, n):
2013-08-04 21:40:54 +02:00
"""
Restituisce una n-tupla con i numeri primi maggiori di p.
"""
2013-07-15 15:34:50 +02:00
return tuple([p for p in itertools.islice(primi.prossimo(p), n)])
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]
"""
audio = pyaudio.PyAudio()
input = audio.open(**opzioni)
2013-08-25 20:06:00 +02:00
dati = input.read(opzioni["rate"] // opzioni["frames_per_buffer"] * n // 2)
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)]
random.shuffle(dati)
2013-08-04 21:40:54 +02:00
for i in range(n):
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))