How to resolve the algorithm Continued fraction/Arithmetic/G(matrix ng, continued fraction n) step by step in the ObjectIcon programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Continued fraction/Arithmetic/G(matrix ng, continued fraction n) step by step in the ObjectIcon programming language

Table of Contents

Problem Statement

This task investigates mathmatical operations that can be performed on a single continued fraction. This requires only a baby version of NG: I may perform perform the following operations: I output a term if the integer parts of

a b

{\displaystyle {\frac {a}{b}}}

and

a

1

b

1

{\displaystyle {\frac {a_{1}}{b_{1}}}}

are equal. Otherwise I input a term from N. If I need a term from N but N has no more terms I inject

{\displaystyle \infty }

. When I input a term t my internal state:

[

a

1

a

b

1

b

]

{\displaystyle {\begin{bmatrix}a_{1}&a\b_{1}&b\end{bmatrix}}}

is transposed thus

[

a +

a

1

∗ t

a

1

b +

b

1

∗ t

b

1

]

{\displaystyle {\begin{bmatrix}a+a_{1}*t&a_{1}\b+b_{1}*t&b_{1}\end{bmatrix}}}

When I output a term t my internal state:

[

a

1

a

b

1

b

]

{\displaystyle {\begin{bmatrix}a_{1}&a\b_{1}&b\end{bmatrix}}}

is transposed thus

[

b

1

b

a

1

b

1

∗ t

a − b ∗ t

]

{\displaystyle {\begin{bmatrix}b_{1}&b\a_{1}-b_{1}t&a-bt\end{bmatrix}}}

When I need a term t but there are no more my internal state:

[

a

1

a

b

1

b

]

{\displaystyle {\begin{bmatrix}a_{1}&a\b_{1}&b\end{bmatrix}}}

is transposed thus

[

a

1

a

1

b

1

b

1

]

{\displaystyle {\begin{bmatrix}a_{1}&a_{1}\b_{1}&b_{1}\end{bmatrix}}}

I am done when b1 and b are zero. Demonstrate your solution by calculating: Using a generator for

2

{\displaystyle {\sqrt {2}}}

(e.g., from Continued fraction) calculate

1

2

{\displaystyle {\frac {1}{\sqrt {2}}}}

. You are now at the starting line for using Continued Fractions to implement Arithmetic-geometric mean without ulps and epsilons. The first step in implementing Arithmetic-geometric mean is to calculate

1 +

1

2

2

{\displaystyle {\frac {1+{\frac {1}{\sqrt {2}}}}{2}}}

do this now to cross the starting line and begin the race.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Continued fraction/Arithmetic/G(matrix ng, continued fraction n) step by step in the ObjectIcon programming language

Source code in the objecticon programming language

# -*- ObjectIcon -*-

import io

procedure main ()
  local cf_13_11, cf_22_7, cf_sqrt2, cf_1_div_sqrt2

  cf_13_11 := CF_rational (13, 11)
  cf_22_7 := CF_rational (22, 7)
  cf_sqrt2 := CF_sqrt2()
  cf_1_div_sqrt2 := CF_hfunc (0, 1, 1, 0, cf_sqrt2)

  show ("13/11", cf_13_11)
  show ("22/7", cf_22_7)
  show ("sqrt(2)", cf_sqrt2)
  show ("13/11 + 1/2", CF_hfunc (2, 1, 0, 2, cf_13_11))
  show ("22/7 + 1/2", CF_hfunc (2, 1, 0, 2, cf_22_7))
  show ("(22/7)/4", CF_hfunc (1, 0, 0, 4, cf_22_7))
  show ("1/sqrt(2)", cf_1_div_sqrt2)
  show ("(2 + sqrt(2))/4", CF_hfunc (1, 2, 0, 4, cf_sqrt2))
  show ("(1 + 1/sqrt(2))/2", CF_hfunc (1, 1, 0, 2,
                                       cf_1_div_sqrt2))
end

procedure show (expr, cf)
  io.write (expr, " => ", cf.to_string())
end

class CF ()                  # A continued fraction.

  private terminated         # Are there no more terms to memoize?
  private memo               # Memoized terms.
  private generate           # A co-expression to generate more terms.

  public new (gen)
    terminated := &no
    memo := []
    generate := gen
    return
  end

  public get_term (i)
    local j, term

    if *memo <= i then {
      if \terminated then {
        fail
      } else {
        every j := *memo to i do {
          if term := @generate then {
            put (memo, term)
          } else {
            terminated := &yes
            fail
          }
        }
      }
    }
    return memo[i + 1]
  end

  public to_string (max_terms)
    local s, sep, i, done, term

    /max_terms := 20

    s := "["
    sep := 0
    i := 0
    done := &no
    while /done do {
      if i = max_terms then {
        # We have reached the maximum of terms to print. Stick an
        # ellipsis in the notation.
        s ||:= ",...]"
        done := &yes
      } else if term := get_term (i) then {
        # Getting a term succeeded. Include the term.
        s ||:= sep_str (sep) || term
        sep := min (sep + 1, 2)
        i +:= 1
      } else {
        # Getting a term failed. We are done.
        s ||:= "]"
        done := &yes
      }
    }
    return s
  end

  private sep_str (sep)
    return (if sep = 0 then "" else if sep = 1 then ";" else ",")
  end

end                             # class CF

class CF_sqrt2 (CF)             # A continued fraction for sqrt(2).
  public override new ()
    CF.new (create gen ())
    return
  end

  private gen ()
    suspend 1
    repeat suspend 2
  end
end                             # class CF_sqrt2

class CF_rational (CF)   # A continued fraction for a rational number.
  public override new (numerator, denominator)
    CF.new (create gen (numerator, denominator))
    return
  end

  private gen (n, d)
    local q, r

    repeat {
      if d = 0 then fail
      q := n / d
      r := n % d
      n := d
      d := r
      suspend q
    }
  end
end                             # class CF_rational

class CF_hfunc (CF) # A continued fraction for a homographic function
                    # of some other continued fraction.

  public override new (a1, a, b1, b, other_cf)
    CF.new (create gen (a1, a, b1, b, other_cf))
    return
  end

  private gen (a1, a, b1, b, other_cf)
    local a1_tmp, a_tmp, b1_tmp, b_tmp
    local i, term, skip_getting_a_term
    local q1, q

    i := 0
    repeat {
      skip_getting_a_term := &no
      if b1 = b = 0 then {
        fail
      } else if b1 ~= 0 & b ~= 0 then {
        q1 := a1 / b1
        q := a / b
        if q1 = q then {
          a1_tmp := a1
          a_tmp := a
          b1_tmp := b1
          b_tmp := b
          a1 := b1_tmp
          a := b_tmp
          b1 := a1_tmp - (b1_tmp * q)
          b := a_tmp - (b_tmp * q)
          suspend q
          skip_getting_a_term := &yes
        }
      }
      if /skip_getting_a_term then {
        if term := other_cf.get_term (i) then {
          i +:= 1
          a1_tmp := a1
          a_tmp := a
          b1_tmp := b1
          b_tmp := b
          a1 := a_tmp + (a1_tmp * term)
          a := a1_tmp
          b1 := b_tmp + (b1_tmp * term)
          b := b1_tmp
        } else {
          a := a1
          b := b1
        }
      }
    }
  end

end                             # class CF_hfunc

  

You may also check:How to resolve the algorithm SHA-1 step by step in the C++ programming language
You may also check:How to resolve the algorithm Pascal's triangle step by step in the Vedit macro language programming language
You may also check:How to resolve the algorithm LZW compression step by step in the C# programming language
You may also check:How to resolve the algorithm CSV to HTML translation step by step in the Fortran programming language
You may also check:How to resolve the algorithm Loop over multiple arrays simultaneously step by step in the Z80 Assembly programming language