hp41programs

Multidzeta

Multidimensional Zeta-Functions for the HP-41


Overview
 

 1°)  Barnes Zeta Function

  a)  Series
  b)  Integral Representation

 2°)  Epstein Zeta Function
 3°)  Multiple Zeta Function

  a)  Program#1
  b)  Program#2
 
 

1°)  Barnes Zeta Function
 

     a) Series
 

-Barnes' Zeta function is defined by

    zB( s,w | a1 , ... , an ) = SUMk1,....,kn=0,1,2,....    1 / ( w + a1 k1 + a2 k2 + ............... + an kn ) s

    and    s > n   ,  w >= 0
 

-If w = 0 , the term corresponding to   k1 = k2 = .......... = kn = 0  is omitted
 

Data Registers:           •  R00 = n                                             ( Registers R00 thru Rnn are to be initialized before executing "BZF" )

                                      •  R01 = a1     •  R02 = a2    ......................       •  Rnn = an
                                         Rn+1 = k1      Rn+2 = k2  ......................          R2n = kn
Flags: /
Subroutines: /
 
 

 01  LBL "BZF"  
 02  STO N
 03  X<>Y
 04  CHS
 05  STO O
 06  CHS
 07  Y^X
 08  X#0?
 09  1/X
 10  STO M
 11  RCL 00 
 12  ST+ X
 13   E3
 14  /
 15  RCL 00
 16  +
 17  ISG X
 18  CLRGX
 19  RCL 00
 20  .1
 21  %
 22  +
 23  RCL 00
 24  +
 25  STO P
 26  RCL N
 27  RDN
 28  GTO 03
 29  LBL 01
 30  RCL P
 31  RCL 00 
 32  -
 33  RCL IND X
 34  ST+ IND P
 35  RCL N
 36  RCL IND P
 37  +
 38  STO Z
 39  RCL O
 40  Y^X
 41  RCL M
 42  +
 43  STO M
 44  LASTX
 45  X=Y?
 46  GTO 04
 47  R^
 48  RCL P
 49  FRC
 50  RCL X
 51  ST+ Y
 52  RCL 00      
 53  ST+ X
 54  +
 55  X<> P
 56  INT
 57  +
 58  RCL IND X
 59  LBL 02
 60  STO IND Y
 61  ISG Y
 62  GTO 02 
 63  R^
 64  LBL 03
 65  R^
 66  RCL IND 00
 67  +
 68  STO Z
 69  RCL O 
 70  Y^X
 71  RCL M
 72  +
 73  STO M
 74  LASTX
 75  X#Y?
 76  GTO 03 
 77  LBL 04
 78  DSE P
 79  GTO 01
 80  X<> N
 81  SIGN
 82  X<> O         
 83  CHS
 84  X<>Y
 85  CLA
 86  END

 
     ( 134 bytes / SIZE 2n+1 )
 
 

   STACK     INPUTS           OUTPUTS
       Y          s                  s
       X         w     zB( s,w | a1 , ... , an )
       L          /                 w

   Provided  R00 = n  ,   R01 = a1 ,  ............ , Rnn = an

Examples:

    •  zB( 7 , 0.8 | 4 , 5 , 6 ) = ?

    n = 3   STO 00    4  STO 01   5  STO 02   6  STO 03

     7    ENTER^
   0.8   XEQ "BZF"  >>>>  zB( 7 , 0.8 | 4 , 5 , 6 ) = 4.768395227           ---Execution time = 54s---

-Likewise,

    •  zB( 7 , 1.2 | 4 , 5 , 6 ) = 0.279095669                          ---Execution time = 97s---
    •  zB( 7 , 0 | 4 , 5 , 6 ) = 0.00007848300723                    ( in 4 seconds with V41 )
    •  zB( 5 , 0.8 | 4 , 5 , 6 ) = 3.052444648                             ( 1 second with V41 )
 

Notes:

-If w = n = 1 , we get the Riemann Zeta function.
-"BZF" is very slow !

-Since register P is used, don't interrupt this routine.
-Synthetic registers M N O P  may be replaced by any unused data registers.

-The following variant is shorter but also slower !
 
 
 

 01 LBL "BZF"   
 02 STO N
 03 X<>Y
 04 CHS
 05 STO O
 06 CHS
 07 Y^X
 08 X#0?
 09 1/X
 10 STO M
 11 RCL 00
 12  E3
 13 /
 14 STO a
 15 ST+ X
 16 RCL 00
 17 ST+ a
 18 ST+ a
 19 +
 20 ISG X
 21 CLRGX
 22 LBL 01        
 23 RCL a
 24 STO P
 25 LBL 02
 26 CLX
 27 SIGN
 28 ST+ IND P
 29 RCL 00
 30 ST+ X
 31 RCL N
 32 LBL 03
 33 RCL IND Y
 34 RCL IND 00
 35 *
 36 +
 37 DSE Y
 38 DSE 00
 39 GTO 03
 40 X<>Y
 41 STO 00
 42 CLX
 43 RCL O
 44 Y^X
 45 RCL M        
 46 +
 47 STO M
 48 LASTX
 49 X#Y?
 50 GTO 01
 51 CLX
 52 STO IND P 
 53 DSE P
 54 GTO 02
 55 X<> N
 56 SIGN
 57 X<> O
 58 CHS
 59 X<>Y
 60 CLA
 61 END

 
     ( 98 bytes / SIZE 2n+1 )
 
 

   STACK     INPUTS           OUTPUTS
       Y          s                  s
       X         w     zB( s,w | a1 , ... , an )
       L          /                 w

   Provided  R00 = n  ,   R01 = a1 ,  ............ , Rnn = an

Examples:

    •  zB( 7 , 0.8 | 4 , 5 , 6 ) = ?

    n = 3   STO 00    4  STO 01   5  STO 02   6  STO 03

     7    ENTER^
   0.8   XEQ "BZF"  >>>>  zB( 7 , 0.8 | 4 , 5 , 6 ) = 4.768395227           ---Execution time = 94s---

-Likewise,

    •  zB( 7 , 1.2 | 4 , 5 , 6 ) = 0.279095669                          ---Execution time = 2m57s---

Notes:

-Since register P is used, don't interrupt this routine.
-Register a is also used, so "BZF" cannot be called as more than a first level subroutine.
-But all these synthetic registers may be replaced by unused data registers...
 

     b) Integral Representation
 

-Barnes' Zeta function may also be computed by the integral:

   zB( s,w | a1 , ... , an ) = ( 1/Gamma(s) )  §0infinity  exp(-w.t)  ts-1 dt / [ ( 1-exp(-a1.t) ) ................. ( 1-exp(-an.t) ) ]
 

-The following program calculates the integral with Gauss-Legendre 10-point formula.
 

Data Registers:           •  R30 = n                              ( Registers R30 thru R30+nn are to be initialized before executing "BZF2" )

                                      •  R31 = a1     •  R32 = a2    ......................       •  R30+nn = an             R26 to R29: temp
 

Flags: /
Subroutines:  "GL10"  ( cf "Gaussian Integration for the HP-41" )  or another integrator... provided it doesn't disturb registers R26 , R27 , ............
                         "1/G+"  or "GAM+"  ( cf "Gamma Function for the HP-41" )

-"GL10" may be replaced by another integrator... provided it doesn't disturb registers R26 , R27 , ............
-The limits of integrations must be in registers R01 & R02
-The name of the subroutine in R00
-And the result in R04.
 
 

 01  LBL "BZF2" 
 02  DEG
 03  STO 28
 04  X<>Y
 05  STO 29
 06  "T"
 07  ASTO 00
 08  CLX
 09  STO 01 
 10  90
 11  STO 02
 12  30.03
 13  RCL 30
 14  +
 15  STO 26
 16  SIGN
 17  LBL 01
 18  STO 03
 19  XEQ "GL10"
 20  RCL 29
 21  XEQ "1/G+"
 22  RCL 04 
 23  ABS
 24  *
 25  D-R
 26  RTN
 27  GTO 01
 28  LBL "T"
 29  TAN
 30  STO Y
 31  RCL 29       
 32  1
 33  -
 34  Y^X
 35  X<>Y
 36  X^2
 37  ENTER^
 38  SIGN
 39  +
 40  *
 41  X<>Y
 42  RCL 28 
 43  *
 44  CHS
 45  E^X
 46  *
 47  RCL 26        
 48  STO 27
 49  RDN
 50  LBL 02
 51  X<>Y
 52  RCL IND 27
 53  *
 54  CHS
 55  E^X-1
 56  /
 57  DSE 27
 58  GTO 02 
 59  RTN
 60  END

 
   ( 104 bytes / SIZE 31+nnn )
 
 

      STACK       INPUTS     OUTPUT1        INPUT2     OUTPUT2
          Y            s            /             /           /
          X           w            I1             m            Im

  Where  Im are successive approximations of zB( s,w | a1 , ... , an )  when the interval of integration is divide in m parts.
  Provided  R30 = n  ,   R31 = a1 ,  ............ , R30+nn = an

Example:    Evaluate   zB( 5 , 0.8 | 4 , 5 , 6 )

     n = 3   STO 30    4  STO 31   5  STO 32   6  STO 33

     5    ENTER^
   0.8   XEQ "BZF2"  >>>>   I1 = 3.225867659                          ---Execution time = 42s---

    4       R/S     >>>>    I4 = 3.047551064
    8       R/S     >>>>    I8 = 3.052316212
   16      R/S     >>>>   I16 = 3.052446238
   32      R/S     >>>>   I32 = 3.052445042
   64      R/S     >>>>   I64 = 3.052445045

Notes:

-Most of these results come from V41 in turbo mode
-The last 2 estimations are certainly the best.
-Compared to the first program listed in the paragraph 1°) a)  (  zB( 5 , 0.8 | 4 , 5 , 6 ) = 3.052444648 )
  we see that "BZF" gives an error of about -4 E-7
 

2°)  Epstein Zeta Function
 

-This function is defined by

    zE( s,w | a1 , ... , an ) = SUMk1,....,kn  1 / ( w + a1 k12 + a2 k22 + ............... + an kn2 ) s

    with   k1 , k2 , .......... , kn  =  ........ -3 , -2 , -1 , 0 , +1 , +2 , +3 , .............

    and    s > n / 2  ,  w >= 0

-If w = 0 , the term corresponding to   k1 = k2 = .......... = kn = 0  is omitted
 

Data Registers:           •  R00 = n                                       ( Registers R00 thru Rnn are to be initialized before executing "EZF" )

                                      •  R01 = a1     •  R02 = a2    ......................       •  Rnn = an
                                         Rn+1 = k1      Rn+2 = k2  ......................          R2n = kn

Flags: /
Subroutines: /

-Line 111 is a three-byte  GTO 01
 
 

  01  LBL "EZF"  
  02  STO N
  03  X<>Y
  04  STO O
  05  Y^X
  06  X#0?
  07  1/X
  08  STO M
  09  RCL 00 
  10  ST+ X
  11   E3
  12  /
  13  RCL 00
  14  +
  15  ISG X
  16  CLRGX
  17  2
  18  RCL 00
  19  .1
  20  %
  21  +
  22  RCL 00
  23  +
  24  STO P
  25  RCL N
  26  X<>Y
  27  ENTER^
  28  GTO 03 
  29  LBL 01
  30  R^
  31  RCL IND P 
  32  X#0?
  33  SIGN
  34  ENTER^
  35  SIGN
  36  ST+ IND P
  37  +
  38  /
  39  STO Q
  40  RCL P
  41  INT
  42  STO Y
  43  RCL 00
  44  -
  45  STO 00
  46  CLX
  47  RCL N
  48  LBL 02
  49  RCL IND Y
  50  X^2
  51  RCL IND 00
  52  *
  53  +
  54  DSE Y
  55  DSE 00
  56  GTO 02
  57  X<>Y
  58  STO 00 
  59  X<> Q
  60  X<>Y
  61  RCL X
  62  RCL O
  63  Y^X
  64  R^
  65  X<>Y
  66  /
  67  RCL M
  68  +
  69  STO M
  70  LASTX
  71  X=Y?
  72  GTO 04
  73  RDN
  74  X<> Z
  75  ST+ X
  76  STO Z
  77  CLX
  78  RCL P
  79  FRC
  80  RCL 00 
  81  ST+ X
  82  +
  83  STO P
  84  ENTER^
  85  LBL 03
  86  SIGN
  87  ST+ IND P
  88  RDN
  89  CLX
  90  RCL IND P
  91  X^2
  92  RCL IND 00
  93  *
  94  RCL Y
  95  +
  96  RCL O
  97  Y^X
  98  R^
  99  X<>Y
100  /
101  RCL M
102  +
103  STO M
104  LASTX
105  X#Y?
106  GTO 03 
107  LBL 04
108  CLX
109  STO IND P 
110  DSE P
111  GTO 01
112  X<> N
113  SIGN
114  X<> O
115  X<>Y
116  CLA
117  END

 
        ( 173 bytes / SIZE 2n+1 )
 
 

   STACK     INPUTS           OUTPUTS
       Y          s                  s
       X         w     zE( s,w | a1 , ... , an )
       L          /                 w

   Provided  R00 = n  ,   R01 = a1 ,  ............ , Rnn = an

Examples:

    •  zE( 7 , 0.8 | 4 , 5 , 6 , 7 ) = ?

    n = 4  STO 00

     4  STO 01   5  STO 02   6  STO 03   7  STO 04

     7    ENTER^
    0.8  XEQ "EZF"  >>>>  4.768419976                          ---Execution time = 81s---

-Likewise, we get:

   •  zE( 7 , 0.8 | 4 , 5 , 6 ) = 4.768418547                 in 37 seconds
   •  zE( 7 , 1.2 | 4 , 5 , 6 ) = 0.279109441                 in 44 seconds
   •  zE( 7 , 0 | 4 , 5 , 6 ) = 0.0001563199653           in 135 seconds

Notes:

-This program is also very slow !

-Since register P is used, don't interrupt"EZT".
-Synthetic registers M N O P  may be replaced by any unused data registers.
-Moreover, large roundoff-errors are to be expected, for example

    •  zE( 7 , 0.8 | 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ) = 4.803314897  ( obtained with V41 )

 whereas the correct result is about  4.803316...

-Here is also a shorter ( but slower ) version:
 
 

 01 LBL "EZF"   
 02 STO N
 03 X<>Y
 04 STO O
 05 Y^X
 06 X#0?
 07 1/X
 08 STO M
 09 RCL 00
 10  E3
 11 /
 12 STO a
 13 ST+ X
 14 RCL 00
 15 ST+ a
 16 ST+ a
 17 +
 18 ISG X
 19 CLRGX
 20 LBL 01
 21 RCL a
 22 STO P
 23 LBL 02
 24 CLX
 25 SIGN
 26 ST+ IND P 
 27 STO Q
 28 RCL 00
 29 ST+ X
 30 RCL N
 31 LBL 03
 32 RCL IND Y
 33 X=0?
 34 GTO 03
 35 X<> Q
 36 ST+ X
 37 X<> Q
 38 X^2
 39 LBL 03
 40 RCL IND 00
 41 *
 42 +
 43 DSE Y
 44 DSE 00
 45 GTO 03
 46 X<>Y
 47 STO 00      
 48 X<> Q
 49 X<>Y
 50 RCL O
 51 Y^X
 52 /
 53 RCL M
 54 +
 55 STO M
 56 LASTX
 57 X#Y?
 58 GTO 01
 59 CLX
 60 STO IND P 
 61 DSE P
 62 GTO 02
 63 X<> N
 64 SIGN
 65 X<> O
 66 X<>Y
 67 CLA
 68 END

 
        ( 111 bytes / SIZE 2n+1 )
 
 

   STACK     INPUTS           OUTPUTS
       Y          s                  s
       X         w     zE( s,w | a1 , ... , an )
       L          /                 w

   Provided  R00 = n  ,   R01 = a1 ,  ............ , Rnn = an

Examples:

    •  zE( 7 , 0.8 | 4 , 5 , 6 , 7 ) = ?

    n = 4  STO 00

     4  STO 01   5  STO 02   6  STO 03   7  STO 04

     7    ENTER^
    0.8  XEQ "EZF"  >>>>  4.768419976                          ---Execution time = 122s---

Notes:

-Since register P is used, don't interrupt this routine.
-Register a is also used, so "EZF" cannot be called as more than a first level subroutine.
-But all these synthetic registers may be replaced by unused data registers...
 

3°)  Multiple Zeta Function
 

     a) Program#1
 

-According to several authors, the multiple zeta function is defined by

  z( s1 , ... , sn ) = SUMn1>n2>....,nk>0  1 / ( n1s1 .......... nksk )

-"MZF" uses this definition.
 

Data Registers:           •  R00 = k                                            ( Registers R00 thru Rnn are to be initialized before executing "MZF" )

                                      •  R01 = s1     •  R02 = s2    ......................       •  Rkk = sk
                                         Rk+1 = n1      Rk+2 = n2  ......................          R2k = nk

Flags: /
Subroutines: /
 
 

  01  LBL "MZF"
  02  CLA
  03  RCL 00
  04  ENTER^
  05  ST+ X
  06   E3
  07  /
  08  +
  09  ISG X
  10  STO N
  11  STO O
  12  INT
  13  RCL 00 
  14  LBL 00
  15  STO IND Y
  16  ISG Y
  17  CLX
  18  DSE X
  19  GTO 00
  20  SIGN
  21  ST- IND N
  22  2
  23  STO P
  24  RCL N
  25  ENTER^
  26  SIGN
  27  LBL 01
  28  ISG Y
  29  X<0?
  30  GTO 02
  31  RCL IND Y
  32  RCL IND P
  33  Y^X
  34  /
  35  ISG P
  36  CLX
  37  GTO 01 
  38  LBL 02
  39  RDN
  40  GTO 06
  41  LBL 03
  42  RCL N
  43  INT
  44  RCL 00
  45   E3
  46  /
  47  +
  48  RCL IND N
  49  LBL 04
  50  ENTER^
  51  SIGN
  52  +
  53  STO IND Y
  54  DSE Y
  55  GTO 04 
  56  SIGN
  57  ST+ X
  58  STO P
  59  RCL O
  60  ENTER^
  61  SIGN
  62  ST+ Y
  63  LBL 05
  64  RCL IND Y
  65  RCL IND P
  66  Y^X
  67  /
  68  ISG P
  69  CLX
  70  ISG Y
  71  GTO 05 
  72  STO Y
  73  RCL IND O
  74  RCL 01
  75  Y^X
  76  /
  77  RCL M
  78  +
  79  STO M
  80  LASTX
  81  X=Y?
  82  GTO 07
  83  RCL O
  84  STO N
  85  LBL 06
  86  SIGN
  87  ST+ IND N
  88  R^
  89  STO Y
  90  RCL IND N
  91  RCL 01 
  92  Y^X
  93  /
  94  RCL M
  95  +
  96  STO M
  97  LASTX
  98  X#Y?
  99  GTO 06
100  LBL 07
101  ISG N
102  GTO 03
103  CLA
104  END

 
     ( 161 bytes / SIZE 2k+1 )
 
 

    STACK     INPUTS          OUTPUTS
        X          /        z( s1 , ... , sk )

   Provided  R00 = n  ,   R01 = s1 ,  ............ , Rkk = sk

Examples:

    •  z( 9 , 9 , 9 ) = ?

   n = 3   STO 00          9  STO 01  STO 02  STO 03

   XEQ "MZF"  >>>>   z( 9 , 9 , 9 ) = 0.0000001081746864           ---Execution time = 109s---

-Likewise:

   •  z( 7 , 7 , 7 ) =  0.000004231442970     ( in  5mn15s )
   •  z( 7 , 8 , 9 ) =  0.000002109230767     ( in 3mn39s )
   •  z( 4 , 5 , 6 ) =  0.0006551508400         ( in a few seconds with V41 )
   •  z( 3 , 4 , 5 ) =  0.005468472467           ( in 35 seconds with V41 )

Notes:

-If k = 1 , we get the Riemann Zeta function.

-"MZF" is very slow, unless the arguments are very large. Roundoff errors are often large too !
-Since register P is used, don't interrupt the program.
-Synthetic registers M N O P  may be replaced by any unused registers
-In this case, if you replace register M by, say R11, delete line 103 and replace line 01 CLA by  CLX  STO 11
 

     b) Program#2
 

-According to other authors, the multiple zeta function is defined by

  z( s1 , ... , sn ) = SUM0<n1<n2<,...,<nk  1 / ( n1s1 .......... nksk )
 

-"MZF2" employs this 2nd definition.
 
 

Data Registers:           •  R00 = k                                           ( Registers R00 thru Rnn are to be initialized before executing "MZF2" )

                                      •  R01 = s1     •  R02 = s2    ......................       •  Rkk = sk
                                         Rk+1 = n1      Rk+2 = n2  ......................          R2k = nk

Flags: /
Subroutines: /
 
 

 01  LBL "MZF2"
 02  CLA
 03  RCL 00
 04  ENTER^
 05  ST+ Y
 06   E3
 07  /
 08  +
 09  STO N
 10  STO O
 11  INT
 12  RCL 00 
 13  LBL 00 
 14  STO IND Y
 15  DSE Y
 16  DSE X
 17  GTO 00
 18  SIGN
 19  ST- IND N
 20  RCL 00
 21  1
 22  LBL 01
 23  DSE Y
 24  X<0?
 25  GTO 02
 26  RCL Y
 27  RCL IND Z
 28  Y^X
 29  /
 30  GTO 01 
 31  LBL 02
 32  RDN
 33  GTO 06
 34  LBL 03
 35  RCL O
 36  INT
 37   E3
 38  /
 39  RCL N
 40  INT
 41  +
 42  RCL IND X
 43  LBL 04
 44  ENTER^
 45  SIGN
 46  +
 47  STO IND Y
 48  ISG Y
 49  GTO 04
 50  RCL 00 
 51  STO P
 52  RCL O
 53  INT
 54  ENTER^
 55  SIGN
 56  ST- Y
 57  ST- P
 58  LBL 05
 59  RCL IND Y
 60  RCL IND P
 61  Y^X
 62  /
 63  DSE Y
 64  DSE P
 65  GTO 05
 66  STO Y
 67  RCL IND O
 68  RCL IND 00
 69  Y^X
 70  /
 71  RCL M
 72  +
 73  STO M
 74  LASTX
 75  X=Y?
 76  GTO 07 
 77  RCL O
 78  STO N
 79  LBL 06
 80  SIGN
 81  ST+ IND N
 82  R^
 83  STO Y
 84  RCL IND N
 85  RCL IND 00
 86  Y^X
 87  /
 88  RCL M
 89  +
 90  STO M
 91  LASTX
 92  X#Y?
 93  GTO 06 
 94  LBL 07
 95  DSE N
 96  GTO 03
 97  CLA
 98  END

 
     ( 155 bytes / SIZE 2k+1 )
 
 

    STACK     INPUTS          OUTPUTS
        X          /        z( s1 , ... , sk )

   Provided  R00 = n  ,   R01 = s1 ,  ............ , Rkk = sk

Example:   "MZF2"  returns the same results as  "MZF"  provided the si are stored in the reverse order, for instance:

   3   STO 00     9  STO 01   8  STO 02   7  STO 03

   XEQ "MZF2"  >>>>   z( 9 , 8 , 7 ) =  0.000002109230767     ( in 3m43s instead of 3m39s )

-Though it saves a few bytes, this second version is a little bit slower than "MZF"
-So, it seems preferable to use "MZF".
 
 

References:

[1]  Klaus Kirsten - "Basic zeta functions and some applications in physics"
[2]  I. Horozof - "Multiple Zeta Functions, Modular Forms and Adeles"
[3]  Borwein, Bradley, Broadhurst, Lisonek - "Combinatorial Aspects of Multiple Zeta Values"