From a9dbfdb94e128941aa2db4e9eb839720ebc9f25a Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Thu, 5 Apr 2018 11:36:16 +0100 Subject: [PATCH] Tweaks for testing examples --- caesar-cipher.ods | Bin 28860 -> 28956 bytes support/utilities.py | 3 ++- test/test_affine.py | 59 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/test_affine.py diff --git a/caesar-cipher.ods b/caesar-cipher.ods index d7cfe16c64c3dc6eb9e9f723656e7ee95b4dbc13..4f4243d0b1df5b148209b32459f283e9ba3b6671 100644 GIT binary patch delta 6642 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 delta 6452 zcmZuW3p`ZY*GMQX<(cvbd1sIiCy7!aqbRS8$P9Ufa6G~!sf*+>7_UhwO~T-K8;?RV zCRCn>kRsvWMkSHHGx~S$|9;;$zw?{DX0PX7Ywfl7tdsMOy?&gX@09r_PGL4S9yYdC zvt&Lij#jfWXEPymAjJvGl0FEFvcMuC9oDce46p`&5m^#WMDQ1=!S#z5rI96Z2@C%w zI3&D5z?u#GH5(_qpUA_*gX+06>t|t2(0iPXl!zwb8x3*+&trSrGy!Ru~q4K_~vSLDCuZE&zUy<=~1M0(L29+=M zEV%EVu2m{%3Rs+uuwWmmN*Fqe_uj$)=`r{8?_C?KsVnom%gKFa5IArmk5i$_^4r)c z10WH9t5*EWw;f@n=i2jQw`6xU zrxG8%+UM(CMm`>2vWd;|^iBg4#s&4D0KIVU{+mHNUtB%n(fK_WN<60fP7GMmo68+iEP3!4n9;(k@QA@I}V37|*GD!~2b$mi^V z5)LTWywxRX=)=1&{*Q+e_8ir5+IDiZNI`PvGI4GPujYjFBa>|z`%}S$aLKr1M{9bE z2Kr_@mNg7F|KOZj+XjB|p4hTjL*#K-dGNRc{>$J`(RHIf5qlc*`MdL6yX%j(Myr0D zV_sv72MyicE+tx=_-cp3^5~tcTgRKXJaC&4G^BcLt)o)6TsMh)@Ui*`pR_SXdOUjW zz=i!giB>mic%nR_ZZE1W79F0DN_crgkiT^Mh1S*H=+zI)9)UOFTmF=*-uu~LE|^PY z-_fzz^Bj#IE`R2z{;0n@UScUHgAM#Hno|XqhB;yNgme|7a$|?`a(eC_cFunNL|7>% zEO4tQyTro%OCo12wb|{S?5|u`{MHxy_J$>i&NJsu^toxp$DW*ZFm61y%*fHj{9~ry zvs@Dw&FA|=ukpU6E#W)a-SnFI4~92sO=|mAC%LwS&}%0UCm3@X%nFc;E8CR!Cd??^ ztI}{i{GlP0!y(VxfnP2oT~hJeu;vBt9j}Vli@v=z{luM0-i*VxQXl!mc~o#Gck%9a_ixe1H`iVc zjVTJ(*BqH^k=`RV)x4|h{XMbP%YEuRYo&|SIxH8lq>?T=10&Dyx%sPZJGXUsl-Y|vo)+>A`uR;?lg5nujvFN?zURZs=)8O#~#YkyMx z-uW=>qf$^%IF;5g8ZGef{`1T{g@T3~Zi)?Vx1Us5=w(>g?7AYn2!D>^5of}CQb)47 ztaI)altlujcP>?WpPX~?usnCx?;K8`Lc>2z#W%!PzLN5kn`7Jczx%vd^m(@L>HgMkCRUqL)i2IxQP>C7c|M06B1RUcKG@BD z{C=Y6ip{$>_CW!87$1^TX0WHXZE=3_E#I!oEm1WL*PFYYHSNRaRCB!wOSo=r!z&&; z^TK17vu@kfsSmk5ax+_!Cl7q)1lL_gW7n3*!Y?g_i6M1tRL)$8zRq(<%R*Q1foD`xJ?nr&ud%iI0G>*L0$R4%A&&MJ=O=T&Ak zi3h?v@|I{r=`*Lo*5!UC4ikTp`f@^*^je5b7tFfHdk%!`j1>NU=OuUi?Xf!tpI#9T z^R;xnryY5nuzsLcbWL|WZEj?p8LhE`sYz_n9nW8$2=#RxHw_8R374+llBnkL?PG|6 zZAcwa_)d;3JJ>2z^j-J)tf9Vd$+dwiyPAkbONr9=w)B7OVbc%);pfbXOS(olKF$vL;&Yqe#;_x*a$;j4_0 zYZ&6_+v-1_FNb+Q{_czUX!X~sQ(|yWaDDaDyTqR#>g&sDd2fDwF(ld4Q2*uUwRPu# zgJJcq!Ix2-v1PrcPSq%B*PW5z^)QLG%_Od3Lp`Iw$i&Y6aH+xChU%xm2V$2O8h?Dz z;dQ;YRrLZo2hveODB zqtr-Xb@{y_DDc!vs76SGy@lGS#a4Up>D}?;KR17uJk$u40n5_xnJ0wAThg>^o1bC$ z-d3;PHw?MbK#bR(UjD9bFuwlkeXvBkRLg1~QR=gF)AC?S$aLa)g^1El>-gdWHH$%u z6T}#yMTMF%m#7%8*Rw4Ghr~)p2e0AP{*a>Bew^}HY+ju;Xx{3#B6~sYN%Dd#ThO=b z22GVxuwcZy1ulU`VRf2Dcl-zr4Hoaff&i2o9lxX_yn~n zeaCa*#LpD5jQv#x&X!M9BHmLERXKRa8g3zO8kCWanTqAsde*-=SH;fWbXp&ykSp^UmL$ z-2o|Y*$m;`pWx0KH`mb6nM7&(mPn$;)nhIBT~q8j^F1LF56TH{xi1c7M(kV789GEI zcCIX*Cr-)R$f#6qr7BepDW>374H&ctF1Rwdon}DB?W#ILr#OLgTJ5w>UFR#g$k5Gp zT7xAxS8YeShYWFV5UpO^AdkpFhR)#!4%vWnB5jN zrsir|F~|!%oCy%|?w67&wJHE0|dk)FV4bc zZG(d^d?4O#T`?%WOIr-mTJFHq;mOF07~~{PIiLx7aTLy+Cb)k+f3h*U6V-t}29TBz z!5xDtYVSI!&XUx8t|66Diwd;{iEd$V<~h8()LuZ#6#O6xcMiO@fith*-7mwL$H@*X zKjFVJkm#yz4|6q5mC6T?dQ)zzR_?Vd1({tOu)Q5@KaF>nXLP-T%2V*}2KL!d`N4Qb zmjf9W5{?5!NtDW8-)BKlWEU@ZRb-AWp4l~|0L-d;VF036HBwZI6rBM3v9P@+Y=4E| zZn7cCr=#nF8zc+c-$ROOkfMB~C=fcge>&UdB-n2Z_Afo*fXn1RU5G-8f?)eCPI7wM=3-1SqwBIOD;Hf+*|AXhxAoG)8~jo*%hC)YvR466Jq?Ps zcj==D8`%CN%jRcz?h$)M<;q`+C&5!^zUuiD$eZNbpe~3Lv-1qX%G0q5^pjvFGMbEF z?)G*dBv`S$d+hZgs#;~->4LLyX2pUQ1!;6XcoM5de=}we>Z!n!7&EX|5@J%!!P=&q zNS8IylYn}c#VX*#;!)F6shp5L=Q-&QF-sU2ViK|l;K_!E!Id8nQ+hW&eElfIq$cAc zEx^!y@T4uCJOxFUEhOU(RU(Uy;EF4OY)C>DcR|dlWQe(tgj)}XnCb+wr6PUp2C}%q ztMt#B4(6vz5YrsY&Uh-0#pe z=`~4|np6r;;n9<7fWI=}e-^xuM?_jrSYLpURs%>V6KRb>T5FJ2Z8(+z3AsW-a&W8{ zBs2vH8G*9H{O|bT*q1LI!NYsFUaj2w%~A{r>B*B>l53QKWG2=z!_+aEQey&MPy+lh zfTjZAj|1P;A+4VwAu&ium!Q~&S8OykLrCu~5E}CxBnoO_hB3&b(@|lv zKuuJ*PYg@<1${Vnm7w@Aosw}3eD@G(jaU1}ixv6lJJTE{AN8u_miDH6fJlcyt82)E zv#_ZnDAJ=_40 zN~ur=JkElz8D_=5N+bTOUNb9^J5Cn_iKRINbLQJ5Gie#S>F+G}(%;1}X(4Fb)zN>T z`yo{+W%`Aku*hjh)u{-HTcG`CD_FWoFIvrFR4OYT^}dFzR7p72b|K5qi+=Bw?o*x~ zM0BUbniX%Y>P>kMk;o7!CcXYVxEKYI2JniCOspG3s_wv!$^fAAetL=x*nx$WRUzvX0##x+Ag=((r$`3o`N7Jjkabl%)&;Vb-N5VMsoo?? z^QS4u`gRhf8BaZo-XLO#!zW-FfFMI(sr84Id0}NQ$a*w&_L)2i?t-kpGO**2H9whh zSqj#4j$vZ;4ucw!Jh1XKp4vK36GU~R++-xx0J2WqM4%!h$?Q`*nvEc9tkvI@rCS*Z z7_urvv$XP2?_)`O&w>EB;98aq__$7)2xyyvo=QMk$<{A?kag|D-cz14b;!Ht!3=By zp1Kb%h=r`j9-6}>h296N_3tKA^vRSg2T-N) z@5IX$f~P9-ZPZjMKcl(VZR43{OR&Wz;Z`IWw4(Yn2Htj5j=q?Qw{>bK(sHc8Nj#i3 zK(KA=poQlk9fgppG=`2A)5&POZ5xv&(Lt-n(DxaGliF}vA_*6oh;$?)9R&p2Lze%P zI&PNAbg49lFQ|{37OZCHr_x4nj$rUKAy{#8fj@O*B!)3R-_SmfA&rdH{@w$`Zr9wN zbQY86(R`ctIr-@~(kN9&z@0Xr!!@LW)Q)ZGz^*=pdPWnFiXhm7nodbKV_}Ds3DjZ+ zc32)zi$N;1Ic_#p7QF2bae^%_8JBhf?CWW#Wto9} z!cZZtgO*kIkK0K@EFWx7b0|iaL%NIKLG(mVOhBb_sNKq(To~pEhV20&nvg&Y5Md4K zw_^ne)P+cFCRDfHVNie7g5 z+(MvA?*$A}DC-XW0%?@S;~>i}GkDq`o?azXXUzKfeELy_0};0<~H; zTRnrGO$yfDTkFpOYkzI0CGVlPB|~0C9UIUm$cva`0w$t?jhX>qwTN1K1e^YZu0c z+O^Ya&B4wJ$m<5RbXO;S;EgQ(13#>-iyv_8py`ouOChkf013DB8b81{VB-jO&Ou)D zB%Ba_fEe!8MHo1lf(xidvczzIXJ@y7GRuNArb(sf+H=!5HM!T6vd4fcF8J6Z!1W&B zN}uPW0nrwZWOkX4h@T8T_5hIUr99Qmd>ZKPHzFP|BK}H8S1{21QI?Cwi1@ic_tqfR zd|cT>`XiB-l(IZPjt00|1QU-r26GM5xOyluI=5=)?*{bKy!YSY91+(X5x+M-2;ZB( zHCM;mt(_45Dr2^*M(bUjR(hRQ&HSy5`M20T(_JS}Q_cn-I~m+&9LzO9Nxlo*hjmhd z-1njy1Ko>0cG>k%*z2^6SvIygvW%BA4Q{(J&zEdzH*%HYLqrL$*J+`awgx><*DjhE zsnY^yy6ir7y`^GMF+uJ{GhNPgS{d_vFDaS>xWO||HG2IN{YPTBMdXZv+v4VLQR=i( z0^N5c&pS)qR;l{?K5Dn>9H$nn(^&nZ@Q!X)!pL-*uO)KHdHLtsUvtC0(uayGC$4lC z690G_^@!r}*VdAe`5oa?S9GOqvTrWg46RRoZL!G16m7{h))v9kiT*ZoksuTz((GPO5(SdkNDv zqC|Js@Fg~hOKd;aXMb*D^&px$BKCE+ygMAn|=bUwPpB8u;-F0{r2o;y^r`6 Xj$hH>{g>J$WzveDB$tslYxaKt