from math import factorial
factorial(26)
403291461126605635584000000
from math import log
log(factorial(26), 10)
26.605619026805893
log(factorial(26), 2) # pocet bitov
88.38195332701626
# overenie za 1 instrukciu ... tip: 1000 rokov
factorial(26)/10**9/3600/24/365 #rokov
12788288341.153147
from sympy import totient
totient(26)
totient(46)
[totient(26)*26, totient(27)*27, totient(46)*46]
[312, 486, 1012]
# Bigramy
factorial(26**2)
18837076841338098831631946502133679752775271363224741858716345371407282033097292730599416302262171748290957921103528196591392861507500824518988967688966916359624032206860634966843747432148697259354246645925344268167298729165308169292992442577858071994436282885840244262495093411188499180250476616063782119317350321221953996342974132759357732916063868147989178924590001010919802612030853406469552341407597023997935813719227154968650674205424600650441415221431155463636095327647889367710873643701162210934115855409138653903155976150466598193389511941024933011950512858916153180139104828249829267481847294571715377527508363338986460670601841954327102737584352972996463528053047436577158048125906693505259934633302120198215660046590792966117499697913607746327891270580423426879310749381564190608843884467754576776063403169281282042637287141665723851293820932576516339136451526141061766024209927597359638049451157569613731215506279692713997850312017855345578024590455099507305768001826968891310614940069186505779880977315189742342849060865467673853958409215859953274067063340906060755332126897856062286820775532342043730800879194735019034488951172458095958882490363201055362823953995372510800577867466578049014840561528319847161829526093128845247946125343190258810332895356940730341389321844820996727707086667865801383351277781568876817001749815875038584794953496710585486918609863362288620062774403077836221212644539686513081739793607426201213514304551124992000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
factorial(26**4)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) File C:\ProgramData\anaconda3\Lib\site-packages\IPython\core\formatters.py:708, in PlainTextFormatter.__call__(self, obj) 701 stream = StringIO() 702 printer = pretty.RepresentationPrinter(stream, self.verbose, 703 self.max_width, self.newline, 704 max_seq_length=self.max_seq_length, 705 singleton_pprinters=self.singleton_printers, 706 type_pprinters=self.type_printers, 707 deferred_pprinters=self.deferred_printers) --> 708 printer.pretty(obj) 709 printer.flush() 710 return stream.getvalue() File C:\ProgramData\anaconda3\Lib\site-packages\IPython\lib\pretty.py:393, in RepresentationPrinter.pretty(self, obj) 390 for cls in _get_mro(obj_class): 391 if cls in self.type_pprinters: 392 # printer registered in self.type_pprinters --> 393 return self.type_pprinters[cls](obj, self, cycle) 394 else: 395 # deferred printer 396 printer = self._in_deferred_types(cls) File C:\ProgramData\anaconda3\Lib\site-packages\IPython\lib\pretty.py:778, in _repr_pprint(obj, p, cycle) 776 """A pprint that just redirects to the normal repr function.""" 777 # Find newlines and replace them with p.break_() --> 778 output = repr(obj) 779 lines = output.splitlines() 780 with p.group(): ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
text = "Zgyzhs rh z hrnkov hfyhgrgfgrlm xrksvi uli gsv Svyivd zokszyvg"
ord("A")
65
ord("Z")
90
def shift_char(c, key=3):
return chr((ord(c)-65+key) % 26+65)
shift_char("A")
'D'
shift_char("A", key=7)
'H'
shift_char("a".upper())
'D'
text.upper() #velke pismena
'ZGYZHS RH Z HRNKOV HFYHGRGFGRLM XRKSVI ULI GSV SVYIVD ZOKSZYVG'
def shift_text(t, key):
result = ""
for character in t:
result += shift_char(character, key)
return result
shift_text(text, 0) #nefunguju male pismena ani medzera
'ZMEFNYTXNTFTNXTQUBTNLENMXMLMXRSTDXQYBOTAROTMYBTSBEOBJTFUQYFEBM'
def shift_text(t, key):
result = ""
for character in t:
result += shift_char(character.upper(), key)
return result
shift_text(text, 0) #problemom su znaky ine ako pismena
'ZGYZHSTRHTZTHRNKOVTHFYHGRGFGRLMTXRKSVITULITGSVTSVYIVDTZOKSZYVG'
def shift_char(c, key=3):
if c.isalpha():
return chr((ord(c)-65+key) % 26+65)
return c
def shift_text(t, key):
result = ""
for character in t:
result += shift_char(character.upper(), key)
return result
shift_text(text, 0)
'ZGYZHS RH Z HRNKOV HFYHGRGFGRLM XRKSVI ULI GSV SVYIVD ZOKSZYVG'
shift_text("Ahoj, svet!", 3)
'DKRM, VYHW!'
shift_text('DKRM, VYHW!', -3)
'AHOJ, SVET!'
shift_text('DKRM, VYHW!', 23)
'AHOJ, SVET!'
# Pythonic
def shift_char(c, key=3):
return chr((ord(c)-65+key) % 26+65) if c.isalpha() else c
def shift_text(t, key):
return "".join(shift_char(character.upper(), key) for character in t)
# return "".join([shift_char(character.upper(), key) for character in t])
shift_text("Ahoj, svet!", 3)
'DKRM, VYHW!'
[shift_char(character.upper(), 3) for character in text]
['C', 'J', 'B', 'C', 'K', 'V', ' ', 'U', 'K', ' ', 'C', ' ', 'K', 'U', 'Q', 'N', 'R', 'Y', ' ', 'K', 'I', 'B', 'K', 'J', 'U', 'J', 'I', 'J', 'U', 'O', 'P', ' ', 'A', 'U', 'N', 'V', 'Y', 'L', ' ', 'X', 'O', 'L', ' ', 'J', 'V', 'Y', ' ', 'V', 'Y', 'B', 'L', 'Y', 'G', ' ', 'C', 'R', 'N', 'V', 'C', 'B', 'Y', 'J']
for posun in range(26):
print(posun, shift_text(text, posun))
0 ZGYZHS RH Z HRNKOV HFYHGRGFGRLM XRKSVI ULI GSV SVYIVD ZOKSZYVG 1 AHZAIT SI A ISOLPW IGZIHSHGHSMN YSLTWJ VMJ HTW TWZJWE APLTAZWH 2 BIABJU TJ B JTPMQX JHAJITIHITNO ZTMUXK WNK IUX UXAKXF BQMUBAXI 3 CJBCKV UK C KUQNRY KIBKJUJIJUOP AUNVYL XOL JVY VYBLYG CRNVCBYJ 4 DKCDLW VL D LVROSZ LJCLKVKJKVPQ BVOWZM YPM KWZ WZCMZH DSOWDCZK 5 ELDEMX WM E MWSPTA MKDMLWLKLWQR CWPXAN ZQN LXA XADNAI ETPXEDAL 6 FMEFNY XN F NXTQUB NLENMXMLMXRS DXQYBO ARO MYB YBEOBJ FUQYFEBM 7 GNFGOZ YO G OYURVC OMFONYNMNYST EYRZCP BSP NZC ZCFPCK GVRZGFCN 8 HOGHPA ZP H PZVSWD PNGPOZONOZTU FZSADQ CTQ OAD ADGQDL HWSAHGDO 9 IPHIQB AQ I QAWTXE QOHQPAPOPAUV GATBER DUR PBE BEHREM IXTBIHEP 10 JQIJRC BR J RBXUYF RPIRQBQPQBVW HBUCFS EVS QCF CFISFN JYUCJIFQ 11 KRJKSD CS K SCYVZG SQJSRCRQRCWX ICVDGT FWT RDG DGJTGO KZVDKJGR 12 LSKLTE DT L TDZWAH TRKTSDSRSDXY JDWEHU GXU SEH EHKUHP LAWELKHS 13 MTLMUF EU M UEAXBI USLUTETSTEYZ KEXFIV HYV TFI FILVIQ MBXFMLIT 14 NUMNVG FV N VFBYCJ VTMVUFUTUFZA LFYGJW IZW UGJ GJMWJR NCYGNMJU 15 OVNOWH GW O WGCZDK WUNWVGVUVGAB MGZHKX JAX VHK HKNXKS ODZHONKV 16 PWOPXI HX P XHDAEL XVOXWHWVWHBC NHAILY KBY WIL ILOYLT PEAIPOLW 17 QXPQYJ IY Q YIEBFM YWPYXIXWXICD OIBJMZ LCZ XJM JMPZMU QFBJQPMX 18 RYQRZK JZ R ZJFCGN ZXQZYJYXYJDE PJCKNA MDA YKN KNQANV RGCKRQNY 19 SZRSAL KA S AKGDHO AYRAZKZYZKEF QKDLOB NEB ZLO LORBOW SHDLSROZ 20 TASTBM LB T BLHEIP BZSBALAZALFG RLEMPC OFC AMP MPSCPX TIEMTSPA 21 UBTUCN MC U CMIFJQ CATCBMBABMGH SMFNQD PGD BNQ NQTDQY UJFNUTQB 22 VCUVDO ND V DNJGKR DBUDCNCBCNHI TNGORE QHE COR ORUERZ VKGOVURC 23 WDVWEP OE W EOKHLS ECVEDODCDOIJ UOHPSF RIF DPS PSVFSA WLHPWVSD 24 XEWXFQ PF X FPLIMT FDWFEPEDEPJK VPIQTG SJG EQT QTWGTB XMIQXWTE 25 YFXYGR QG Y GQMJNU GEXGFQFEFQKL WQJRUH TKH FRU RUXHUC YNJRYXUF
$ C = (a \cdot P + b) \mod n $
$ P = \left(a^{-1} \cdot C - a^{-1} \cdot b\right) \mod n$
def affine_char(char, key): #key=(a, b)
# a*char+b % n
# a = key[0]
# b = key[1]
return chr((key[0]*(ord(char.upper())-65)+key[1]) % 26+65) if char.isalpha() else char;
affine_char("A", (1, 3))
'D'
affine_char("A", (3, 5))
'F'
IF...
||
vv
NE...
for c in 'IFNE':
print(c, ord(c)-65)
I 8 F 5 N 13 E 4
from sympy import Eq, solve
from sympy.abc import a, b
solve([Eq(a*8+b, 13), Eq(a*5+b, 4)])
{a: 3, b: -11}
3*8-11
13
3*5-11
4
# potrebujeme inverzny prvok ku 3 ... 1/3
for x in range(26):
print(x, (x*3)% 26)
0 0 1 3 2 6 3 9 4 12 5 15 6 18 7 21 8 24 9 1 10 4 11 7 12 10 13 13 14 16 15 19 16 22 17 25 18 2 19 5 20 8 21 11 22 14 23 17 24 20 25 23
for x in range(26):
if (x*3)% 26 == 1:
print(x)
9
from sympy import mod_inverse
mod_inverse(3, 26)
9
affine_char("I", (3, -11))
'N'
affine_char("F", (3, -11))
'E'
affine_char("I", (3, 15))
'N'
$ P = \left(a^{-1} \cdot C - a^{-1} \cdot b\right) \mod n$
affine_char("N", (9, -9*15))
'I'
(-9*15) % 26
21
affine_char("N", (9, 21))
'I'
affine_char("E", (9, 21))
'F'
def affine_char(char, key): #key=(a, b)
# a*char+b % n
# a = key[0]
# b = key[1]
return chr((key[0]*(ord(char.upper())-65)+key[1]) % 26+65) if char.isalpha() else char;