This commit is contained in:
lda committed 2026-03-05 02:27:37 +07:00
1 parent 305c6fea94
commit 31cff943be
2 files changed
+53 -52

No files matched your search

+40 -38
View File
@@ -1,8 +1,8 @@
from collections.abc import Sequence, Iterable, Iterator
from typing import Literal
from collections.abc import Iterable, Iterator, Sequence
from functools import reduce
from itertools import chain
from operator import xor
from typing import Literal
def maj(a, b, c):
@@ -10,15 +10,15 @@ def maj(a, b, c):
return 1 * (a + b + c >= 2)
class Bih(Sequence):
class LSFR(Sequence[int]):
def __init__(
self, length: Literal[19, 22, 23], initializer: Iterable | None = None
self, length: Literal[19, 22, 23], initializer: Iterable[int] | None = None
):
match length:
case 19:
self.m = 8
self.n = (13, 16, 17, 18)
self.g = 18
self.m = 8 # bit to decide major
self.n = (13, 16, 17, 18) # bits to xor to 0 when self.maj == major
self.g = 18 # bit to xor to stream
case 22:
self.m = 10
self.n = (20, 21)
@@ -33,38 +33,58 @@ class Bih(Sequence):
if initializer is None:
initializer = [0] * length
self.q = list(initializer)
self.q: list[int] = list(initializer)
if len(self.q) != length:
raise ValueError()
def __len__(self):
return len(self.q)
def __getitem__(self, bro):
return self.q[bro]
def __str__(self):
return str(self.q)
@property
def maj(self):
def maj(self) -> int:
return self[self.m]
@property
def st(self):
def st(self) -> int:
return self[self.g]
@property
def element_new(self):
def elements_new(self) -> tuple[int, ...]:
return tuple(self[n] for n in self.n)
@property
def n_new(self):
return reduce(xor, self.element_new)
def n_new(self) -> int:
return reduce(xor, self.elements_new)
def roll(self):
assert len(self) == self.len
self.q = [self.n_new, *self[:-1]]
def __getitem__(self, bro):
return self.q[bro]
def majroll(a: LSFR, b: LSFR, c: LSFR):
"roll when maj"
r = maj(a.maj, b.maj, c.maj)
for i in (a, b, c):
if i.maj == r:
i.roll()
def s(a: LSFR, b: LSFR, c: LSFR):
"collect for stream"
return reduce(xor, (i.st for i in (a, b, c)))
def op(a: LSFR, b: LSFR, c: LSFR, n: int) -> Iterator[int]:
"this the one"
for _ in range(n):
majroll(a, b, c)
yield s(a, b, c)
def dihcheese(n: int, length: int):
@@ -72,29 +92,12 @@ def dihcheese(n: int, length: int):
def dih(n: int, length: int):
return Bih(length, dihcheese(n, length))
def majroll(a: Bih, b: Bih, c: Bih):
r = maj(a.maj, b.maj, c.maj)
for i in (a, b, c):
if i.maj == r:
i.roll()
def s(a: Bih, b: Bih, c: Bih):
return reduce(xor, (i.st for i in (a, b, c)))
return LSFR(length, dihcheese(n, length)) # type: ignore
def cih(n: int):
n = [int(i) for i in str(n)]
return Bih(len(n), n)
def op(a: Bih, b: Bih, c: Bih, n: int):
for i in range(n):
majroll(a, b, c)
yield s(a, b, c)
ln = [int(i) for i in str(n)]
return LSFR(len(ln), ln) # type: ignore
def opdih(a, b, c, n):
@@ -121,12 +124,12 @@ def main1(fahh=True):
return list(d)
def render(dih: Iterator[int]):
def render(dih: Iterable[int]):
bih = " ".join(str(i) for i in reversed(list(dih)))
return f"-> {bih}"
def dihrender(dih: Iterator[int]):
def dihrender(dih: Iterable[int]):
ar = "->"
cih = []
for i in dih:
@@ -151,4 +154,3 @@ if __name__ == "__main__":
print(main2())
print(*dihrender(main1(False)), sep="\n")
print(render(main1()))
+13 -14
View File
@@ -3,15 +3,15 @@ from functools import cached_property
from typing import Callable
def inv(a, n):
def inv(a: int, n: int):
return pow(a, -1, n)
class LdaRsahh:
def __init__(
self,
p,
q,
p: int,
q: int,
d: int | None = None,
e: int | None = None,
ln_ops: Callable[[int, int], int] | None = None,
@@ -23,9 +23,9 @@ class LdaRsahh:
raise ValueError("at least d or e needs to be fed in")
ln = self.ln
if e is None:
e = inv(d, ln)
e = inv(d, ln) # type: ignore
elif not 1 < e < ln:
e %= ln
e %= ln # bad
if not 1 < e < ln:
raise ValueError(f"{e = }, {ln = }, 1 < e < ln not satisfied")
if math.gcd(e, ln) != 1:
@@ -38,19 +38,19 @@ class LdaRsahh:
@cached_property
def n(self):
return self.p * self.q
return self._p * self._q
@cached_property
def ln(self):
return self._lnops((self.p - 1), (self.q - 1))
return self._lnops((self._p - 1), (self._q - 1))
@property
def p(self):
return self._p
# @property
# def p(self):
# return self._p
@property
def q(self):
return self._q
# @property
# def q(self):
# return self._q
@property
def d(self):
@@ -65,4 +65,3 @@ class LdaRsahh:
def dec(self, c: int):
return pow(c, self.d, self.n)