From 719f5816e930278b848a421e9e8723710f1573de Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Wed, 7 May 2025 10:48:37 +0200 Subject: [PATCH] init repo --- chapter-03/binseq/main.py | 3 + .../__pycache__/decidable.cpython-313.pyc | Bin 2937 -> 0 bytes chapter-03/decidable/main.py | 1 + .../__pycache__/dedekint.cpython-313.pyc | Bin 682 -> 0 bytes chapter-03/dedekint/main.py | 1 + .../__pycache__/interval.cpython-313.pyc | Bin 0 -> 2197 bytes chapter-03/interval/interval.py | 25 +++++++ chapter-03/interval/main.py | 17 +++++ chapter-03/ratseq/binseq.py | 11 +++ chapter-03/ratseq/main.py | 66 ++++++++++++++++++ chapter-03/ratseq/ratseq.py | 6 ++ 11 files changed, 130 insertions(+) delete mode 100644 chapter-03/decidable/__pycache__/decidable.cpython-313.pyc delete mode 100644 chapter-03/dedekint/__pycache__/dedekint.cpython-313.pyc create mode 100644 chapter-03/interval/__pycache__/interval.cpython-313.pyc create mode 100644 chapter-03/interval/interval.py create mode 100644 chapter-03/interval/main.py create mode 100644 chapter-03/ratseq/binseq.py create mode 100644 chapter-03/ratseq/main.py create mode 100644 chapter-03/ratseq/ratseq.py diff --git a/chapter-03/binseq/main.py b/chapter-03/binseq/main.py index c39ee1b..4819a15 100644 --- a/chapter-03/binseq/main.py +++ b/chapter-03/binseq/main.py @@ -2,7 +2,10 @@ from binseq import REAL from math import isqrt # integer sqrt # Theorem 3.1 (2) +# Es gibt eine berechenbare Folge (qn)n∈N rationaler Zahlen, die schnell gegen x konvergiert. +# d.h. |x − qi| < 2^(−i) für alle i ∈ N. +# bin_seq(1/3) = 0.010101... def one_third(n): if n == 1: return "." if n % 2 == 0: return "0" diff --git a/chapter-03/decidable/__pycache__/decidable.cpython-313.pyc b/chapter-03/decidable/__pycache__/decidable.cpython-313.pyc deleted file mode 100644 index d03a1f41490cee7aa21c4332e99af44e80d092ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2937 zcmb7GU2Gf25#IaZ`D}_mA}QH%<>V5{X)Z2BIihM*k?pW*3fGR5#%BU7OyqDP&obrX zQQA8d{sB@w1$2K9IjC&v$po4Q87)xfEf0N2fV>8fkN_4I4j`a;@k>FM0n*3L?2(j| zxDQ=`yR$p9GdnZi%&{Gb93n6#?ul2w2ods6+;oTBA=+6W)`&q2;Q~1?P(edlyda*J zs06e`D)TL<}dna?XR<$z=mg`nZj^$;3O=}DGHQ&xm*Q$%lzU5bHuH~e2Fx~Jf zUZ!-_TJ&w29vjba8<>V&YIN}iQ%$qtR(#WB5%g%ZyG7$(A51G`d+_id!`lOce>&8L zJ@~uGge4}=ReX;r)b^LDyU%+Sgt+(r0%DD1h$|I@G=$2PFZX=UixV9>NzR$T3*}`) zm@E)tjS!NTF7AydnuTEq86huT#_aNum%2LA5T-PoclR36K*tCHonktHmJ7Mbe}L}8 zT=#*lhTYZZ>C#9cmj*dko|*lh(!#E#8HM{l%l$dJ9Z%j-Ka_Sl znsRrePmhtrvDWkaDuu`cT&|Ze5Z!^<S5z(aN?Lh6)bRp-jq8TJAX%@ta!0>b^#DW_Jl9PbPefxvORiTYMZ zGtZy;K-{f4P>m>oWf)mlHh6+5x1p5UtYdD9EQ=OF#A zyhifmB2eESaN238dpT)1bA|uw29}<98C~V$;xpi1(4J+h+t90WUWPsk=~+-+X}16i z$!DhvP4RTS3&a@#z8~;lPdqJ7zDmex;g#SW#EL@N_8{O=uc{`&$+tyM)b>h4U(v`V z(1h_b#L07naHQ~xqtC%1WD7ekv{b>R&jaOQ0JRlfJoLvvvyoj?&`!JjAvDr>^<|j; zvqBoVX8)t1(JzNaKQcB_fBDTIa@7Xa zHOj(e+pSeAE^auQSjt56-z#E0#4*O?rRADWUjQ`}8*ktM`ik}cM$iBv9Bti~v&0X* zK`*@vFu~h*V(|}d-M-bZ?pN2VfJWX5KDc)KS|fLVW_@NWszXAxR) zaO}(2sk;2Q|Bbrx7(iU!iXGonj|UEpg3{7nMD}p}K5#I}fHEu;KJvX}LW2jV;3J?t ztEulc@g6L|h9SN!7*ZNKnJdn`7&KTz2GsXZ+_ghU6#jbT#V8q<0S?M6gO+oW31c_q z>)L7Urlg(Fbcr4X`5>&=9d(%k_6S9nn2Ige^n4mL6SRO44+5@O9^P?1PSjK zFu}JmIZ#(0Lt|aKd!(M*?n~XjwSH^ka+j&Jq-^!MkUN+fX{IOSQr5!u-kE9^9kAv@tQEbPg;r?I@}m; z5m=h9Y)o%VJRI40ee0!D-{MJ2B}!sDJN1+#L#f7i3zufFY?S!!)6}P>&z}1h8EpxK zTOv@cS2-nwezH2y!Q-(D&gu$_ zm1>S-m+-HXH)_q5f)Ix0tBW^Y3&Mh_4&2=DI#Z{D+?=83K?I@iAFam)V&k@;Ja diff --git a/chapter-03/decidable/main.py b/chapter-03/decidable/main.py index 3ee7393..9309044 100644 --- a/chapter-03/decidable/main.py +++ b/chapter-03/decidable/main.py @@ -2,6 +2,7 @@ from decidable import REAL from gmpy2 import mpq # Theorem 3.1 (5) +# Es gibt eine ganze Zahl z ∈ Z und eine entscheidbare Menge A ⊆ N mit x = z + xA, wobei xA := SUMi∈A 2^(−i−1) print(REAL.from_rational(mpq(1,3)).as_str(10)) print(REAL.from_rational(mpq(41,5)).as_str(10)) diff --git a/chapter-03/dedekint/__pycache__/dedekint.cpython-313.pyc b/chapter-03/dedekint/__pycache__/dedekint.cpython-313.pyc deleted file mode 100644 index 4ab87018385cba1efcd4352bb60d415141ca3904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmX|8F>ljA6uz@Bsi_F<5`i*Br~{TrT+wy{p+*r)i&BIahDfK2b4i_^?c|*^WMe|& z2Sj4bNPhqle}f5hQYWTvhzuR!o}K2T`}{q>_wM`d-MUuWC3dxz|Hhx~_csRji*3mI z(2^wyNl4Gh83o!z?wmVkF1Stdgghmo+aMu3amo&0k6gBKuOEpWIBt= zq7t_nZ5uC1p8yRBI3Wc$bo#7c32481>{M*_*g=&EgPo9phYE(hf75w;i%COA(MG*E z7`bcrdf&p5eArjTZ-lWm)w`x>p1m7`COEm(|CN(xTo8}_8%n}()M4HBt5;}MX z*+gFDGU#T>be@Ym&QhUT9SaK`>ma%m(_BL9@F*C{p}dOId`sHXh4DC#(>Ukc)X;SM zKCGfB!bkFb_U-xFG6MJ}J^ukVr6Q5GX_xaP8_pH-hn&ymLTxg8oR4DAxr$SnW}E|F z8*r|M4YEwZBcyfCHJXmN$a9DX^IU4quL>_wTKVT9ArZ83-nbyFE9)5VLzM0xCEJbNo;yjSIAUPHqssNEVX X{UUL2JM=F>EE@j5Z)oEu+7s$_>Q?MPg8>tEQ6tIbBkX1dH3-*&HY>T=rj@t9mL$1mkq z>oq%n-SRxA>{@>QGOJ&=KM(Bu2lZN`8CZc+_bhjM9$>?F{Cs)UY6Lc$o_#0pcp$7> zZcmtLY;esq9nT3&lMiALGw~9?-A@8+lFrEJ-2s4m16^2?a+Fh)MR+2_cOje>Stg}k zSYltmGA%}0PXdd>DT<5^S;z)mmP*QjcPy3qV(DNmM&dNghJ*;d+QEJ-{iUxgeC7Xe zul%p>Rq)Aj|l|ArgBfTocI)m^jp$3 ztQgO#+2A^0nzeeR>7tx8&9$cGMms6fyyh@Ja2*fc$u!w%aAx@3>@@&BVwyhIYT2{` zc$d$bf$f{-4he6<4`3Ln01VR~0{EKjNs^k~(-gHt_mfne2+h&548Pup6Z4On7<(1` zpNXX7f${j;JxnAXx)}YEVY}01k#?qoEEI7I6ND7`;F+e0-eTXP^%upN@@_eZpD|877C3i6X^#cS4%6EXaq6Cd!zf?nNqk{0JCz z-vEHJOP$$X-&)_kwRP*k{GG49AAU6YaP-mm!|}(~4`pBQr{Huuyz(47bxo?34CB@F7CWkPAa1KFKOs@yB^QfCdK#GPWLdFW(qRL0^ge7uj zPorvKKLHS0qu~-X0wlI@ICc`(-U|!)eO3SyQE}+=T&9%%AtmX=3j*-+^?q8o9qbdB H#KC_8ponj) literal 0 HcmV?d00001 diff --git a/chapter-03/interval/interval.py b/chapter-03/interval/interval.py new file mode 100644 index 0000000..17aef63 --- /dev/null +++ b/chapter-03/interval/interval.py @@ -0,0 +1,25 @@ +class REAL: # nested.py + def __init__(self, l, u): + self.lower = l + self.upper = u + + def asString(self, n): + l = self.lower(n) + u = self.upper(n) + return ("[ " + l.numerator.digits() + "/" + l.denominator.digits() + + ", " + u.numerator.digits() + "/" + u.denominator.digits() + "]") + + def __add__(self, y): + return REAL_add(self, y) + + +class REAL_add(REAL): + def __init__(self, x, y): + self.x = x + self.y = y + + def lower(self, n): + return self.x.lower(n) + self.y.lower(n) + + def upper(self, n): + return self.x.upper(n) + self.y.upper(n) diff --git a/chapter-03/interval/main.py b/chapter-03/interval/main.py new file mode 100644 index 0000000..80cfb61 --- /dev/null +++ b/chapter-03/interval/main.py @@ -0,0 +1,17 @@ +from interval import REAL +from gmpy2 import mpq # rationale Zahlen + + +def lower_one(n): + return mpq(1,1)-mpq(1,n) +def upper_one(n): + return mpq(1,1)+mpq(1,n) + +x = REAL(lower_one,upper_one); y = x + x + +print ("x: "+x.asString(10)) +print ("y: "+y.asString(10)) + + +print ("x: "+x.asString(10000)) +print ("y: "+y.asString(10000)) \ No newline at end of file diff --git a/chapter-03/ratseq/binseq.py b/chapter-03/ratseq/binseq.py new file mode 100644 index 0000000..dea2445 --- /dev/null +++ b/chapter-03/ratseq/binseq.py @@ -0,0 +1,11 @@ +from collections.abc import Callable + +class REAL: + def __init__(self, f: Callable[[int], str]) -> None: + self.binseq = f + + def as_string(self, w: int) -> str: + s = "" + for n in range(w): + s += self.binseq(n) + return s \ No newline at end of file diff --git a/chapter-03/ratseq/main.py b/chapter-03/ratseq/main.py new file mode 100644 index 0000000..e9aa7f3 --- /dev/null +++ b/chapter-03/ratseq/main.py @@ -0,0 +1,66 @@ +from gmpy2 import mpq # rationale Zahlen +from binseq import REAL as REAL_bs +from ratseq import REAL as REAL_ra + + +def ra_oneThird(p): + return mpq(1, 3) + + +x = REAL_ra(ra_oneThird) +print("x: " + x.asString(-50)) + +# Theorem 3.1 (3) +# Es gibt eine berechenbare Intervallschachtelung von Intervallen mit rationalen Endpunkten, die gegen x konvergiert +# d.h. es gibt berechen- +# bare Folgen (an)n∈N und (bn)n∈N + +class REAL_ra_from_bs(REAL_ra): # Subklasse + def __init__(self, x): + self.x = x + + def approx(self, p): + n = 0 + q = mpq(0, 1) + v = mpq(1, 1) + while True: + c = self.x.binseq(n) + if c == "-": v = mpq(-1, 1) + if c == ".": break + q = 2 * q + if c == "1": q += v + n = n + 1 + k = 1 + while k <= -p: + v = v / 2 + c = self.x.binseq(n + k) + if c == "1": q += v + k = k + 1 + return q + + +def bs_one_third(n): + if n == 1: return "." + if n % 2 == 0: return "0" + return "1" + + +def bs_almost_one(n): + if n == 0: return "1" + if n == 1: return "." + if n < 40: return "0" + return "1" + + +# Create binseq +y1 = REAL_bs(bs_almost_one) +# Create rational approx of the created binseq +z1 = REAL_ra_from_bs(y1) + +# Create binseq +y2 = REAL_bs(bs_one_third) +# Create rational approx of the created binseq +z2 = REAL_ra_from_bs(y2) + +print("y1: " + y1.as_string(50) + "\nz1: " + z1.asString(-50)) +print("y2: " + y2.as_string(50) + "\nz2: " + z2.asString(-50)) \ No newline at end of file diff --git a/chapter-03/ratseq/ratseq.py b/chapter-03/ratseq/ratseq.py new file mode 100644 index 0000000..470c135 --- /dev/null +++ b/chapter-03/ratseq/ratseq.py @@ -0,0 +1,6 @@ +class REAL: + def __init__(self, f): self.approx = f + + def asString(self, p): + q = self.approx(p) + return q.numerator.digits() + "/" + q.denominator.digits() \ No newline at end of file