How to resolve the algorithm Bernoulli numbers step by step in the EchoLisp programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Bernoulli numbers step by step in the EchoLisp programming language

Table of Contents

Problem Statement

Bernoulli numbers are used in some series expansions of several functions   (trigonometric, hyperbolic, gamma, etc.),   and are extremely important in number theory and analysis. Note that there are two definitions of Bernoulli numbers;   this task will be using the modern usage   (as per   The National Institute of Standards and Technology convention). The   nth   Bernoulli number is expressed as   Bn.

The Akiyama–Tanigawa algorithm for the "second Bernoulli numbers" as taken from wikipedia is as follows:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Bernoulli numbers step by step in the EchoLisp programming language

Source code in the echolisp programming language

(lib 'bigint) ;; lerge numbers
(lib 'gloops) ;; classes

(define-class Rational null ((a :initform #0) (b :initform #1)))
(define-method tostring  (Rational) (lambda (r) (format "%50d / %d" r.a r.b)))
(define-method normalize (Rational) (lambda (r) ;; divide a and b by gcd
		 (let ((g (gcd r.a r.b)))
		 (set! r.a (/ r.a g)) (set! r.b (/ r.b g))
 		 (when (< r.b 0) (set! r.a ( - r.a)) (set! r.b (- r.b))) ;; denominator > 0
 		r)))
			
(define-method initialize (Rational) (lambda (r) (normalize r)))
(define-method add (Rational) (lambda (r n)  ;; + Rational any number
			(normalize (Rational (+ (* (+ #0 n) r.b) r.a) r.b))))
(define-method add (Rational Rational) (lambda (r q) ;;; + Rational Rational
			(normalize (Rational (+ (* r.a q.b) (* r.b q.a)) (* r.b q.b)))))
(define-method sub (Rational Rational) (lambda (r q) 
			(normalize (Rational (- (* r.a q.b) (* r.b q.a)) (* r.b q.b)))))
(define-method mul (Rational Rational) (lambda (r q) 
			(normalize (Rational  (* r.a q.a)  (* r.b q.b)))))
(define-method mul (Rational) (lambda (r n) 
			(normalize (Rational  (* r.a (+ #0 n))  r.b ))))
(define-method div (Rational Rational) (lambda (r q) 
			(normalize (Rational  (* r.a q.b)  (* r.b q.a)))))


;; Bernoulli numbers
;; http://rosettacode.org/wiki/Bernoulli_numbers
(define A (make-vector 100 0))

(define (B n)
(for ((m (1+ n))) ;; #1 creates a large integer
	(vector-set! A m (Rational #1 (+ #1 m)))
	(for ((j (in-range m 0 -1)))
	  (vector-set! A (1- j) 
	  	(mul (sub (vector-ref A (1- j)) (vector-ref A j)) j))))
	  (vector-ref A 0))

    (for ((b (in-range 0 62 2))) (writeln b (B b)))  → 

0                                                      1 / 1    
2                                                      1 / 6    
4                                                     -1 / 30    
6                                                      1 / 42    
8                                                     -1 / 30    
10                                                      5 / 66    
12                                                   -691 / 2730    
14                                                      7 / 6    
16                                                  -3617 / 510    
18                                                  43867 / 798    
20                                                -174611 / 330    
22                                                 854513 / 138    
24                                             -236364091 / 2730    
26                                                8553103 / 6    
28                                           -23749461029 / 870    
30                                          8615841276005 / 14322    
32                                         -7709321041217 / 510    
34                                          2577687858367 / 6    
36                                  -26315271553053477373 / 1919190    
38                                       2929993913841559 / 6    
40                                 -261082718496449122051 / 13530    
42                                 1520097643918070802691 / 1806    
44                               -27833269579301024235023 / 690    
46                               596451111593912163277961 / 282    
48                          -5609403368997817686249127547 / 46410    
50                            495057205241079648212477525 / 66    
52                        -801165718135489957347924991853 / 1590    
54                       29149963634884862421418123812691 / 798    
56                    -2479392929313226753685415739663229 / 870    
58                    84483613348880041862046775994036021 / 354    
60           -1215233140483755572040304994079820246041491 / 56786730      

(B 1) → 1 / 2


  

You may also check:How to resolve the algorithm Bulls and cows step by step in the ALGOL 68 programming language
You may also check:How to resolve the algorithm Babbage problem step by step in the BASIC programming language
You may also check:How to resolve the algorithm Straddling checkerboard step by step in the Perl programming language
You may also check:How to resolve the algorithm Vector products step by step in the uBasic/4tH programming language
You may also check:How to resolve the algorithm Brownian tree step by step in the Fantom programming language