programowanie
student:
Witam jak w systemie Sage zrealizowac potęgowanie modularne
22 lip 11:59
Mateusz:
Mozna tradycyjnie metodą podnoszenia do kwadratu i mnożenia wyglądałoby to tak:
def ModExp(x,e,N):
r"""
Wejście:
x−x∊C
e−nieujemna liczba całkowita
N−dodatnia liczba całkowita
Wynik:
xe mod N
"""
ebits=e.bits()
ebitlen= len(ebits)
y=1
for j in xrange(ebitlen):
y=y2%N
if(ebits[ebitlen−1−j]==1):
y=x*y%N
return y
Sage oferuje tez do potęgowania modularnego specjalne obiekty ktore dziłają znaczni szybciej
niz sposobem tradycyjnym takim obiektem jest np IntegerModRing mozna go np tak wykorzystac:
pzykładowo chce policzyc 111345mod 1024
sage: R=IntegerModRing(1024)
sage: x=R(111)
sage: x 345 itd.
zapis troche nieczytelny bo znaczenie symboli w edytorze jest jakie jest ale mysle ze miałes
choc troche z tym do czynienia i połapiesz sie co jest czym tutaj ze trzeba np zastosowac
"daszek" itd
22 lip 12:40
student: Ok dzieki a jak rozwiązac to zadanie:
Ile istnieje afinicznych szyfrów Cezara spełniających warunek różnowartościowości?
24 lip 18:57
Mateusz:
afiniczny szyfr Cezara mozna uogolnic taką funkcją:
C=E([a,b],p)=(ap+b) mod 26
ponadto musi byc spełniony warunek różnowartościowosci
if p≠q to E(k,p)≠E(k,q)
i wracając do zadania mamy 12 mozliwosci dla a bo a=(1, 3, 5 ,7, 9, 11.....25) i 26 mozliwych
dozwolonych wartosci b bo b∊<0, 25> co daje nam w sumie 12*26 mozliwych kombinacji
24 lip 19:08