mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-26 06:48:04 +02:00
misc
This commit is contained in:
parent
3b2bfde37a
commit
2a6fb8abc9
7 changed files with 163 additions and 1 deletions
36
source-code/Pseudocode/SolveLinearCongruences/Makefile
Normal file
36
source-code/Pseudocode/SolveLinearCongruences/Makefile
Normal file
|
@ -0,0 +1,36 @@
|
|||
SOURCE = SolveLinearCongruences
|
||||
DELAY = 80
|
||||
DENSITY = 300
|
||||
WIDTH = 500
|
||||
|
||||
make:
|
||||
pdflatex $(SOURCE).tex -output-format=pdf
|
||||
pdflatex $(SOURCE).tex -output-format=pdf
|
||||
make clean
|
||||
|
||||
clean:
|
||||
rm -rf $(TARGET) *.class *.html *.log *.aux *.data *.gnuplot
|
||||
|
||||
gif:
|
||||
pdfcrop $(SOURCE).pdf
|
||||
convert -verbose -delay $(DELAY) -loop 0 -density $(DENSITY) $(SOURCE)-crop.pdf $(SOURCE).gif
|
||||
make clean
|
||||
|
||||
png:
|
||||
make
|
||||
make svg
|
||||
inkscape $(SOURCE).svg -w $(WIDTH) --export-png=$(SOURCE).png
|
||||
|
||||
transparentGif:
|
||||
convert $(SOURCE).pdf -transparent white result.gif
|
||||
make clean
|
||||
|
||||
svg:
|
||||
make
|
||||
#inkscape $(SOURCE).pdf --export-plain-svg=$(SOURCE).svg
|
||||
pdf2svg $(SOURCE).pdf $(SOURCE).svg
|
||||
# Necessary, as pdf2svg does not always create valid svgs:
|
||||
inkscape $(SOURCE).svg --export-plain-svg=$(SOURCE).svg
|
||||
rsvg-convert -a -w $(WIDTH) -f svg $(SOURCE).svg -o $(SOURCE)2.svg
|
||||
inkscape $(SOURCE)2.svg --export-plain-svg=$(SOURCE).svg
|
||||
rm $(SOURCE)2.svg
|
3
source-code/Pseudocode/SolveLinearCongruences/Readme.md
Normal file
3
source-code/Pseudocode/SolveLinearCongruences/Readme.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
Compiled example
|
||||
----------------
|
||||

|
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
|
@ -0,0 +1,46 @@
|
|||
\documentclass{article}
|
||||
\usepackage[pdftex,active,tightpage]{preview}
|
||||
\setlength\PreviewBorder{2mm}
|
||||
|
||||
\usepackage[utf8]{inputenc} % this is needed for umlauts
|
||||
\usepackage[ngerman]{babel} % this is needed for umlauts
|
||||
\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
|
||||
\usepackage{amssymb,amsmath,amsfonts} % nice math rendering
|
||||
\usepackage{braket} % needed for \Set
|
||||
\usepackage{algorithm,algpseudocode}
|
||||
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{decorations.pathreplacing,calc}
|
||||
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
|
||||
\newcommand*{\AddNote}[4]{%
|
||||
\begin{tikzpicture}[overlay, remember picture]
|
||||
\draw [decoration={brace,amplitude=0.5em},decorate,very thick]
|
||||
($(#3)!(#1.north)!($(#3)-(0,1)$)$) --
|
||||
($(#3)!(#2.south)!($(#3)-(0,1)$)$)
|
||||
node [align=center, text width=2.5cm, pos=0.5, anchor=west] {#4};
|
||||
\end{tikzpicture}
|
||||
}%
|
||||
|
||||
\begin{document}
|
||||
\begin{preview}
|
||||
\begin{algorithm}[H]
|
||||
\begin{algorithmic}
|
||||
\Require $R \in \mathbb{Z}^n, P \in (\mathbb{N}_{\geq 1})^n, n \in \mathbb{N}_{\geq 1}$, where \\
|
||||
$R$ is a vector with all rests $r_i$ and\\
|
||||
$P$ is a vector with all modulos $p_i$ such that\\
|
||||
($x \equiv r_i \mod p_i$) and $\left(i \neq j \Rightarrow \Call{gcd}{p_i, p_j} = 1 \right)$
|
||||
\\
|
||||
\State $M \gets \prod_{p \in P} p$
|
||||
|
||||
\For{$i \in \{1, \dots, n\}$}
|
||||
\State $M_i \gets \frac{M}{p_i} $
|
||||
\State $y_i \gets \Call{getMultiplicativeInverse}{M_i, R_i}$
|
||||
\EndFor
|
||||
\\
|
||||
\State \Return $(\sum_{i=1}^n R_i y_i M_i, M)$
|
||||
\end{algorithmic}
|
||||
\caption{Solve a system of linear congruences}
|
||||
\label{alg:solveCongruences}
|
||||
\end{algorithm}
|
||||
\end{preview}
|
||||
\end{document}
|
|
@ -0,0 +1,49 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
def ExtendedEuclideanAlgorithm(a, b):
|
||||
"""
|
||||
Calculates gcd(a,b) and a linear combination such that
|
||||
gcd(a,b) = a*x + b*y
|
||||
|
||||
As a side effect:
|
||||
If gcd(a,b) = 1 = a*x + b*y
|
||||
Then x is multiplicative inverse of a modulo b.
|
||||
"""
|
||||
aO, bO = a, b
|
||||
|
||||
x=lasty=0
|
||||
y=lastx=1
|
||||
while (b!=0):
|
||||
q= a/b
|
||||
a, b = b, a%b
|
||||
x, lastx = lastx-q*x, x
|
||||
y, lasty = lasty-q*y, y
|
||||
|
||||
return {
|
||||
"x": lastx,
|
||||
"y": lasty,
|
||||
"gcd": aO * lastx + bO * lasty
|
||||
}
|
||||
|
||||
def solveLinearCongruenceEquations(rests, modulos):
|
||||
"""
|
||||
Solve a system of linear congruences.
|
||||
|
||||
>>> solveLinearCongruenceEquations([4, 12, 14], [19, 37, 43])
|
||||
{'congruence class': 22804, 'modulo': 30229}
|
||||
"""
|
||||
assert len(rests) == len(modulos)
|
||||
x = 0
|
||||
M = reduce(lambda x, y: x*y, modulos)
|
||||
|
||||
for mi, resti in zip(modulos, rests):
|
||||
Mi = M / mi
|
||||
s = ExtendedEuclideanAlgorithm(Mi, mi)["x"]
|
||||
e = s * Mi
|
||||
x += resti * e
|
||||
return {"congruence class": ((x % M) + M) % M, "modulo": M}
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
doctest.testmod()
|
Loading…
Add table
Add a link
Reference in a new issue