5 <meta name=
"viewport" content=
"width=device-width, initial-scale=1, minimum-scale=1" />
6 <meta name=
"generator" content=
"pdoc 0.9.2" />
7 <title>szyfrow.affine API documentation
</title>
8 <meta name=
"description" content=
"Enciphering and deciphering using the [affine cipher](https://en.wikipedia.org/wiki/Affine_cipher).
9 Also attempts to break messages that use an …" />
10 <link rel=
"preload stylesheet" as=
"style" href=
"https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity=
"sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin
>
11 <link rel=
"preload stylesheet" as=
"style" href=
"https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity=
"sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin
>
12 <link rel=
"stylesheet preload" as=
"style" href=
"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin
>
13 <style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:
1.5em}#content{padding:
20px}#sidebar{padding:
30px;overflow:hidden}#sidebar
> *:last-child{margin-bottom:
2cm}.http-server-breadcrumbs{font-size:
130%;margin:
0 0 15px
0}#footer{font-size:
.75em;padding:
5px
30px;border-top:
1px solid #ddd;text-align:right}#footer p{margin:
0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:
30px}h1,h2,h3,h4,h5{font-weight:
300}h1{font-size:
2.5em;line-height:
1.1em}h2{font-size:
1.75em;margin:
1em
0 .50em
0}h3{font-size:
1.4em;margin:
25px
0 10px
0}h4{margin:
0;font-size:
105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:
.2em
0}a{color:#
058;text-decoration:none;transition:color
.3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^=
"header-"]{margin-top:
2em}.ident{color:#
900}pre code{background:#f8f8f8;font-size:
.8em;line-height:
1.4em}code{background:#f2f2f1;padding:
1px
4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:
0;border-top:
1px solid #ccc;border-bottom:
1px solid #ccc;margin:
1em
0;padding:
1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:
10%}#http-server-module-list p{margin-top:
0}.toc ul,#index{list-style-type:none;margin:
0;padding:
0}#index code{background:transparent}#index h3{border-bottom:
1px solid #ddd}#index ul{padding:
0}#index h4{margin-top:
.6em;font-weight:bold}@media (min-width:
200ex){#index .two-column{column-count:
2}}@media (min-width:
300ex){#index .two-column{column-count:
3}}dl{margin-bottom:
2em}dl dl:last-child{margin-bottom:
4em}dd{margin:
0 0 1em
3em}#header-classes + dl
> dd{margin-bottom:
3em}dd dd{margin-left:
2em}dd p{margin:
10px
0}.name{background:#eee;font-weight:bold;font-size:
.85em;padding:
5px
10px;display:inline-block;min-width:
40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name
> span:first-child{white-space:nowrap}.name.class
> span:nth-child(
2){margin-left:
.4em}.inherited{color:#
999;border-left:
5px solid #eee;padding-left:
1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:
400;font-size:
1.25em}.desc h3{font-size:
1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#
666;text-align:right;font-weight:
400;font-size:
.8em;text-transform:uppercase}.source summary
> *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:
1em}.source pre{max-height:
500px;overflow:auto;margin:
0}.source pre code{font-size:
12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\
2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:
1em}img{max-width:
100%}td{padding:
0 .5em}.admonition{padding:
.1em
.5em;margin-bottom:
1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}
</style>
14 <style media=
"screen and (min-width: 700px)">@media screen and (min-width:
700px){#sidebar{width:
30%;height:
100vh;overflow:auto;position:sticky;top:
0}#content{width:
70%;max-width:
100ch;padding:
3em
4em;border-left:
1px solid #ddd}pre code{font-size:
1em}.item .name{font-size:
1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:
1.5em}.toc
> ul
> li{margin-top:
.5em}}
</style>
15 <style media=
"print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#
000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:
" (" attr(href)
")";font-size:
90%}a[href][title]:after{content:none}abbr[title]:after{content:
" (" attr(title)
")"}.ir a:after,a[href^=
"javascript:"]:after,a[href^=
"#"]:after{content:
""}pre,blockquote{border:
1px solid #
999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:
100% !important}@page{margin:
0.5cm}p,h2,h3{orphans:
3;widows:
3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}
</style>
16 <script defer
src=
"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity=
"sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin
></script>
17 <script>window.addEventListener('DOMContentLoaded', () =
> hljs.initHighlighting())
</script>
21 <article id=
"content">
23 <h1 class=
"title">Module
<code>szyfrow.affine
</code></h1>
25 <section id=
"section-intro">
26 <p>Enciphering and deciphering using the
<a href=
"https://en.wikipedia.org/wiki/Affine_cipher">affine cipher
</a>.
27 Also attempts to break messages that use an affine cipher.
</p>
28 <p>The affine cipher operates one letter at a time. It converts each letter to a
29 number, then enciphers that number using a multiplier and a number. The result
30 is taken mod
26 and converted back into a letter.
</p>
31 <p>For a multiplier
<em>m
</em> and adder
<em>a
</em>, a letter converted to number
<em>x
</em> is
32 enciphered as
<em>E(x)
</em> = (
<em>m
</em> <em>x
</em> +
<em>a
</em>) mod
26. Deciphering uses the modular
33 inverse of
<em>m
</em>,
<em>m
</em>⁻¹, so that
<em>D(x)
</em> =
<em>m
</em>⁻¹ (
<em>x
</em> -
<em>a
</em>) mod
26.
</p>
34 <p>If
<code>one_based
</code> is
<code>True
</code>, the conversion between letters and numbers maps
35 'a' →
1, 'b' →
2, … 'z'→
26 and the
<code>mod
</code> function is adjusted to keep
36 numbers in this range during enciphering and deciphering. If
<code>one_based
</code> is
37 <code>False
</code>, the conversion maps 'a' →
0, 'b' →
1, … 'z'→
25 and
<code>mod
</code> behaves
39 <details class=
"source">
41 <span>Expand source code
</span>
43 <pre><code class=
"python">"""Enciphering and deciphering using the [affine cipher](https://en.wikipedia.org/wiki/Affine_cipher).
44 Also attempts to break messages that use an affine cipher.
46 The affine cipher operates one letter at a time. It converts each letter to a
47 number, then enciphers that number using a multiplier and a number. The result
48 is taken mod
26 and converted back into a letter.
50 For a multiplier _m_ and adder _a_, a letter converted to number _x_ is
51 enciphered as _E(x)_ = (_m_ _x_ + _a_) mod
26. Deciphering uses the modular
52 inverse of _m_, _m_⁻¹, so that _D(x)_ = _m_⁻¹ (_x_ - _a_) mod
26.
54 If `one_based` is `True`, the conversion between letters and numbers maps
55 'a
' →
1,
'b
' →
2, …
'z
'→
26 and the `mod` function is adjusted to keep
56 numbers in this range during enciphering and deciphering. If `one_based` is
57 `False`, the conversion maps
'a
' →
0,
'b
' →
1, …
'z
'→
25 and `mod` behaves
61 from szyfrow.support.utilities import *
62 from szyfrow.support.language_models import *
64 modular_division_table = {
65 (multiplier, (multiplier * plaintext) %
26): plaintext
66 for plaintext in range(
26)
67 for multiplier in range(
26)
71 def affine_encipher_letter(accented_letter, multiplier=
1, adder=
0, one_based=True):
72 """Encipher a letter, given a multiplier and adder.
74 Accented version of latin letters (such as é and ö) are converted to their
75 non-accented versions before encryption.
77 >>> cat(affine_encipher_letter(l,
3,
5, True) \
78 for l in string.ascii_letters)
79 'hknqtwzcfiloruxadgjmpsvybeHKNQTWZCFILORUXADGJMPSVYBE
'
80 >>> cat(affine_encipher_letter(l,
3,
5, False) \
81 for l in string.ascii_letters)
82 'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC
'
84 letter = unaccent(accented_letter)
85 if letter in string.ascii_letters:
86 letter_number = pos(letter)
87 if one_based: letter_number +=
1
88 cipher_number = (letter_number * multiplier + adder) %
26
89 if one_based: cipher_number -=
1
90 if letter in string.ascii_uppercase:
91 return unpos(cipher_number).upper()
93 return unpos(cipher_number)
97 def affine_decipher_letter(letter, multiplier=
1, adder=
0, one_based=True):
98 """Encipher a letter, given a multiplier and adder
100 >>> cat(affine_decipher_letter(l,
3,
5, True) \
101 for l in
'hknqtwzcfiloruxadgjmpsvybeHKNQTWZCFILORUXADGJMPSVYBE
')
102 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
'
103 >>> cat(affine_decipher_letter(l,
3,
5, False) \
104 for l in
'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC
')
105 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
'
107 if letter in string.ascii_letters:
108 cipher_number = pos(letter)
109 if one_based: cipher_number +=
1
111 modular_division_table[multiplier, (cipher_number - adder) %
26]
113 if one_based: plaintext_number -=
1
114 if letter in string.ascii_uppercase:
115 return unpos(plaintext_number).upper()
117 return unpos(plaintext_number)
121 def affine_encipher(message, multiplier=
1, adder=
0, one_based=True):
122 """Encipher a message
124 >>> affine_encipher(
'hours passed during which jerico tried every
' \
125 'trick he could think of
',
15,
22, True)
126 'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls omytd jlaxe mh
'
128 enciphered = [affine_encipher_letter(l, multiplier, adder, one_based)
130 return cat(enciphered)
132 def affine_decipher(message, multiplier=
1, adder=
0, one_based=True):
133 """Decipher a message
135 >>> affine_decipher(
'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg
' \
136 'jfaoe ls omytd jlaxe mh
',
15,
22, True)
137 'hours passed during which jerico tried every trick he could think of
'
139 enciphered = [affine_decipher_letter(l, multiplier, adder, one_based)
141 return cat(enciphered)
145 def affine_break(message, fitness=Pletters):
146 """Breaks an affine cipher using frequency analysis.
148 It tries all possible combinations of multiplier, adder, and one_based,
149 scores the fitness of the text decipherd with each combination, and returns
150 the key that produces the most fit deciphered text.
152 >>> affine_break(
'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls
' \
153 'omytd jlaxe mh jm bfmibj umis hfsul axubafkjamx. ls kffkxwsd jls
' \
154 'ofgbjmwfkiu olfmxmtmwaokttg jlsx ls kffkxwsd jlsi zg tsxwjl. jlsx
' \
155 'ls umfjsd jlsi zg hfsqysxog. ls dmmdtsd mx jls bats mh bkbsf. ls
' \
156 'bfmctsd kfmyxd jls lyj, mztanamyu xmc jm clm cku tmmeaxw kj lai
' \
157 'kxd clm ckuxj.
') # doctest: +ELLIPSIS
158 ((
15,
22, True), -
340.601181913...)
160 sanitised_message = sanitise(message)
163 best_one_based = True
164 best_fit = float(
"-inf
")
165 for one_based in [True, False]:
166 for multiplier in [x for x in range(
1,
26,
2) if x !=
13]:
167 for adder in range(
26):
168 plaintext = affine_decipher(sanitised_message,
169 multiplier, adder, one_based)
170 fit = fitness(plaintext)
171 if fit
> best_fit:
173 best_multiplier = multiplier
175 best_one_based = one_based
177 return (best_multiplier, best_adder, best_one_based), best_fit
</code></pre>
185 <h2 class=
"section-title" id=
"header-functions">Functions
</h2>
187 <dt id=
"szyfrow.affine.affine_break"><code class=
"name flex">
188 <span>def
<span class=
"ident">affine_break
</span></span>(
<span>message, fitness=
<function Pletters
>)
</span>
191 <div class=
"desc"><p>Breaks an affine cipher using frequency analysis.
</p>
192 <p>It tries all possible combinations of multiplier, adder, and one_based,
193 scores the fitness of the text decipherd with each combination, and returns
194 the key that produces the most fit deciphered text.
</p>
195 <pre><code class=
"language-python-repl">>>> affine_break('lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls ' 'omytd jlaxe mh jm bfmibj umis hfsul axubafkjamx. ls kffkxwsd jls ' 'ofgbjmwfkiu olfmxmtmwaokttg jlsx ls kffkxwsd jlsi zg tsxwjl. jlsx ' 'ls umfjsd jlsi zg hfsqysxog. ls dmmdtsd mx jls bats mh bkbsf. ls ' 'bfmctsd kfmyxd jls lyj, mztanamyu xmc jm clm cku tmmeaxw kj lai ' 'kxd clm ckuxj.') # doctest: +ELLIPSIS
196 ((
15,
22, True), -
340.601181913...)
198 <details class=
"source">
200 <span>Expand source code
</span>
202 <pre><code class=
"python">def affine_break(message, fitness=Pletters):
203 """Breaks an affine cipher using frequency analysis.
205 It tries all possible combinations of multiplier, adder, and one_based,
206 scores the fitness of the text decipherd with each combination, and returns
207 the key that produces the most fit deciphered text.
209 >>> affine_break(
'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls
' \
210 'omytd jlaxe mh jm bfmibj umis hfsul axubafkjamx. ls kffkxwsd jls
' \
211 'ofgbjmwfkiu olfmxmtmwaokttg jlsx ls kffkxwsd jlsi zg tsxwjl. jlsx
' \
212 'ls umfjsd jlsi zg hfsqysxog. ls dmmdtsd mx jls bats mh bkbsf. ls
' \
213 'bfmctsd kfmyxd jls lyj, mztanamyu xmc jm clm cku tmmeaxw kj lai
' \
214 'kxd clm ckuxj.
') # doctest: +ELLIPSIS
215 ((
15,
22, True), -
340.601181913...)
217 sanitised_message = sanitise(message)
220 best_one_based = True
221 best_fit = float(
"-inf
")
222 for one_based in [True, False]:
223 for multiplier in [x for x in range(
1,
26,
2) if x !=
13]:
224 for adder in range(
26):
225 plaintext = affine_decipher(sanitised_message,
226 multiplier, adder, one_based)
227 fit = fitness(plaintext)
228 if fit
> best_fit:
230 best_multiplier = multiplier
232 best_one_based = one_based
234 return (best_multiplier, best_adder, best_one_based), best_fit
</code></pre>
237 <dt id=
"szyfrow.affine.affine_decipher"><code class=
"name flex">
238 <span>def
<span class=
"ident">affine_decipher
</span></span>(
<span>message, multiplier=
1, adder=
0, one_based=True)
</span>
241 <div class=
"desc"><p>Decipher a message
</p>
242 <pre><code class=
"language-python-repl">>>> affine_decipher('lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg ' 'jfaoe ls omytd jlaxe mh',
15,
22, True)
243 'hours passed during which jerico tried every trick he could think of'
245 <details class=
"source">
247 <span>Expand source code
</span>
249 <pre><code class=
"python">def affine_decipher(message, multiplier=
1, adder=
0, one_based=True):
250 """Decipher a message
252 >>> affine_decipher(
'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg
' \
253 'jfaoe ls omytd jlaxe mh
',
15,
22, True)
254 'hours passed during which jerico tried every trick he could think of
'
256 enciphered = [affine_decipher_letter(l, multiplier, adder, one_based)
258 return cat(enciphered)
</code></pre>
261 <dt id=
"szyfrow.affine.affine_decipher_letter"><code class=
"name flex">
262 <span>def
<span class=
"ident">affine_decipher_letter
</span></span>(
<span>letter, multiplier=
1, adder=
0, one_based=True)
</span>
265 <div class=
"desc"><p>Encipher a letter, given a multiplier and adder
</p>
266 <pre><code class=
"language-python-repl">>>> cat(affine_decipher_letter(l,
3,
5, True) for l in 'hknqtwzcfiloruxadgjmpsvybeHKNQTWZCFILORUXADGJMPSVYBE')
267 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
268 >>> cat(affine_decipher_letter(l,
3,
5, False) for l in 'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC')
269 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
271 <details class=
"source">
273 <span>Expand source code
</span>
275 <pre><code class=
"python">def affine_decipher_letter(letter, multiplier=
1, adder=
0, one_based=True):
276 """Encipher a letter, given a multiplier and adder
278 >>> cat(affine_decipher_letter(l,
3,
5, True) \
279 for l in
'hknqtwzcfiloruxadgjmpsvybeHKNQTWZCFILORUXADGJMPSVYBE
')
280 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
'
281 >>> cat(affine_decipher_letter(l,
3,
5, False) \
282 for l in
'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC
')
283 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
'
285 if letter in string.ascii_letters:
286 cipher_number = pos(letter)
287 if one_based: cipher_number +=
1
289 modular_division_table[multiplier, (cipher_number - adder) %
26]
291 if one_based: plaintext_number -=
1
292 if letter in string.ascii_uppercase:
293 return unpos(plaintext_number).upper()
295 return unpos(plaintext_number)
297 return letter
</code></pre>
300 <dt id=
"szyfrow.affine.affine_encipher"><code class=
"name flex">
301 <span>def
<span class=
"ident">affine_encipher
</span></span>(
<span>message, multiplier=
1, adder=
0, one_based=True)
</span>
304 <div class=
"desc"><p>Encipher a message
</p>
305 <pre><code class=
"language-python-repl">>>> affine_encipher('hours passed during which jerico tried every ' 'trick he could think of',
15,
22, True)
306 'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls omytd jlaxe mh'
308 <details class=
"source">
310 <span>Expand source code
</span>
312 <pre><code class=
"python">def affine_encipher(message, multiplier=
1, adder=
0, one_based=True):
313 """Encipher a message
315 >>> affine_encipher(
'hours passed during which jerico tried every
' \
316 'trick he could think of
',
15,
22, True)
317 'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls omytd jlaxe mh
'
319 enciphered = [affine_encipher_letter(l, multiplier, adder, one_based)
321 return cat(enciphered)
</code></pre>
324 <dt id=
"szyfrow.affine.affine_encipher_letter"><code class=
"name flex">
325 <span>def
<span class=
"ident">affine_encipher_letter
</span></span>(
<span>accented_letter, multiplier=
1, adder=
0, one_based=True)
</span>
328 <div class=
"desc"><p>Encipher a letter, given a multiplier and adder.
</p>
329 <p>Accented version of latin letters (such as é and ö) are converted to their
330 non-accented versions before encryption.
</p>
331 <pre><code class=
"language-python-repl">>>> cat(affine_encipher_letter(l,
3,
5, True) for l in string.ascii_letters)
332 'hknqtwzcfiloruxadgjmpsvybeHKNQTWZCFILORUXADGJMPSVYBE'
333 >>> cat(affine_encipher_letter(l,
3,
5, False) for l in string.ascii_letters)
334 'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC'
336 <details class=
"source">
338 <span>Expand source code
</span>
340 <pre><code class=
"python">def affine_encipher_letter(accented_letter, multiplier=
1, adder=
0, one_based=True):
341 """Encipher a letter, given a multiplier and adder.
343 Accented version of latin letters (such as é and ö) are converted to their
344 non-accented versions before encryption.
346 >>> cat(affine_encipher_letter(l,
3,
5, True) \
347 for l in string.ascii_letters)
348 'hknqtwzcfiloruxadgjmpsvybeHKNQTWZCFILORUXADGJMPSVYBE
'
349 >>> cat(affine_encipher_letter(l,
3,
5, False) \
350 for l in string.ascii_letters)
351 'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC
'
353 letter = unaccent(accented_letter)
354 if letter in string.ascii_letters:
355 letter_number = pos(letter)
356 if one_based: letter_number +=
1
357 cipher_number = (letter_number * multiplier + adder) %
26
358 if one_based: cipher_number -=
1
359 if letter in string.ascii_uppercase:
360 return unpos(cipher_number).upper()
362 return unpos(cipher_number)
364 return letter
</code></pre>
367 <dt id=
"szyfrow.affine.cat"><code class=
"name flex">
368 <span>def
<span class=
"ident">cat
</span></span>(
<span>iterable, /)
</span>
371 <div class=
"desc"><p>Concatenate any number of strings.
</p>
372 <p>The string whose method is called is inserted in between each given string.
373 The result is returned as a new string.
</p>
374 <p>Example: '.'.join(['ab', 'pq', 'rs']) -
> 'ab.pq.rs'
</p></div>
376 <dt id=
"szyfrow.affine.lcat"><code class=
"name flex">
377 <span>def
<span class=
"ident">lcat
</span></span>(
<span>iterable, /)
</span>
380 <div class=
"desc"><p>Concatenate any number of strings.
</p>
381 <p>The string whose method is called is inserted in between each given string.
382 The result is returned as a new string.
</p>
383 <p>Example: '.'.join(['ab', 'pq', 'rs']) -
> 'ab.pq.rs'
</p></div>
385 <dt id=
"szyfrow.affine.wcat"><code class=
"name flex">
386 <span>def
<span class=
"ident">wcat
</span></span>(
<span>iterable, /)
</span>
389 <div class=
"desc"><p>Concatenate any number of strings.
</p>
390 <p>The string whose method is called is inserted in between each given string.
391 The result is returned as a new string.
</p>
392 <p>Example: '.'.join(['ab', 'pq', 'rs']) -
> 'ab.pq.rs'
</p></div>
405 <li><h3>Super-module
</h3>
407 <li><code><a title=
"szyfrow" href=
"index.html">szyfrow
</a></code></li>
410 <li><h3><a href=
"#header-functions">Functions
</a></h3>
412 <li><code><a title=
"szyfrow.affine.affine_break" href=
"#szyfrow.affine.affine_break">affine_break
</a></code></li>
413 <li><code><a title=
"szyfrow.affine.affine_decipher" href=
"#szyfrow.affine.affine_decipher">affine_decipher
</a></code></li>
414 <li><code><a title=
"szyfrow.affine.affine_decipher_letter" href=
"#szyfrow.affine.affine_decipher_letter">affine_decipher_letter
</a></code></li>
415 <li><code><a title=
"szyfrow.affine.affine_encipher" href=
"#szyfrow.affine.affine_encipher">affine_encipher
</a></code></li>
416 <li><code><a title=
"szyfrow.affine.affine_encipher_letter" href=
"#szyfrow.affine.affine_encipher_letter">affine_encipher_letter
</a></code></li>
417 <li><code><a title=
"szyfrow.affine.cat" href=
"#szyfrow.affine.cat">cat
</a></code></li>
418 <li><code><a title=
"szyfrow.affine.lcat" href=
"#szyfrow.affine.lcat">lcat
</a></code></li>
419 <li><code><a title=
"szyfrow.affine.wcat" href=
"#szyfrow.affine.wcat">wcat
</a></code></li>
426 <p>Generated by
<a href=
"https://pdoc3.github.io/pdoc"><cite>pdoc
</cite> 0.9.2</a>.
</p>