crypto/crittografia/numeri.py
Rnhmjoj 916515e5e2 Miglioramenti vari
* Sostituito il test di primalità con il Miller-Rabin (k=64) (più
veloce ma non deterministico)
* Utlizzati generatori in sostituzione alle tuple (più veloce)
* Sostituita la concatenazione di stringhe con join (più veloce)
* Correzioni per PEP8
2013-12-06 19:57:21 +01:00

83 lines
1.5 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.
"""
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))