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. """ if n == 2: return True if n % 2 == 0: return False s = 0 d = n - 1 while True: q, r = divmod(d, 2) if r == 1: break s += 1 d = q for i in range(k): a = random.randrange(2, n) if pow(a, d, n) == 1: return True for i in range(s): if pow(a, 2 ** i * d, n) == n - 1: return True return False def primi(p, n): """ Restituisce gli n numeri primi succesivi a p. [Generatore] """ 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"] * n // 2) 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))