Zeta

# Riemann Zeta Function for the HP-41

Overview

1°) Real Arguments

a)  Elementary Method
b)  Borwein Algorithm

2°) Complex Arguments
3°) Quaternion Arguments

a)  Elementary Method
b)  Borwein Algorithm

1°)  Real Arguments

a) Elementary Method

-The Riemann Zeta function is defined by the series:       Zeta(x) = 1 + 1/2x + 1/3x + ........ + 1/nx + ......     ( for x > 1)
but the following program uses the formula:          Zeta(x) = ( 1 - 1/2x + 1/3x - 1/4x + ...... ) / ( 1 - 21-x )   where roundoff errors are smaller.

-If  x < 0.5 , we have:   Zeta(x) = GAM(1-x)  2x  PIx-1  Sin(PI.x/2)  Zeta(1-x)

Data Registers:  R00 thru R03 ( temp )
Flags: /
Subroutine:  "GAM"  ( cf "Gamma Function for the HP-41" )  if x < 1 only.

 01  LBL "ZETA" 02  1 03  X<>Y 04  X>Y? 05  GTO 00       06  STO 02 07  - 08  STO 03 09  XEQ 00 10  1 11  ASIN 12  RCL 02 13  * 14  SIN 15  * 16  PI 17  RCL 03       18  Y^X 19  / 20  2 21  RCL 02 22  Y^X 23  * 24  X<> 03 25  XEQ "GAM" 26  RCL 03        27  * 28  RTN 29  LBL 00 30  CHS 31  STO 01  32  1 33  STO 00 34  ENTER^ 35  LBL 01 36  CLX 37  SIGN 38  RCL 00 39  + 40  STO 00        41  RCL 01  42  Y^X 43  - 44  CHS 45  LASTX 46  RND  47  X#0? 48  GTO 01 49  SIGN 50  2 51  RCL 01        52  Y^X 53  ST+ X 54  - 55  / 56  ABS 57  END

( 76 bytes / SIZE 004 )

 STACK INPUT OUTPUT X x Zeta(x)

Examples:

FIX 7       3    XEQ "ZETA"    returns    Zeta(3) = 1.2020569          ( in 3m14s )
FIX 9       3           R/S            -------    Zeta(3) = 1.202056903      ( in 15m12s )

FIX 9   -7.49        R/S            -------  Zeta(-7.49) = 0.003312040169  ( in 15s )

Notes:

-The accuracy is determined by the display format ( line 46 ).
-Execution time and Zeta(x) tend to infinity as x tends to 1.

b) Borwein Algorithm

-This second version uses the method described in reference [3]

Data Registers:  R00 to R07: temp
Flags: /
Subroutine:    "1/G+"  ( cf "Gamma function for the HP-41" )

-Line 69 is a synthetic TEXT0 instruction ( NOP )

 01  LBL "ZETA"  02  X#0?  03  GTO 00        04  .5  05  CHS  06  RTN  07  LBL 00  08  STO 01  09  STO 07  10  .5  11  X<=Y?  12  GTO 00  13  SIGN  14  X<>Y  15  -  16  STO 01  17  XEQ 00  18  1 19  ASIN  20  RCL 07        21  *  22  SIN  23  *  24  PI  25  ST/ Y  26  ST+ X  27  RCL 07   28  Y^X  29  *  30  X<> 01  31  XEQ "1/G+"  32  ST/ 01  33  X<> 01  34  RTN  35  LBL 00  36  14 37  STO 00  38  STO 03  39  SIGN  40  STO 02        41  STO 04  42  STO 05  43  CHS  44  STO 06   45  CLX  46  LBL 01  47  RCL 05  48  RCL 00  49  RCL 01  50  CHS  51  Y^X  52  *  53  RCL 06  54  CHS 55  STO 06  56  *  57  +  58  RCL 00        59  ENTER^  60  ST+ Y  61  ST* Y  62  -  63  RCL 04   64  *  65  RCL 03  66  X^2  67  RCL 00  68  DSE X  69  ""  70  X^2  71  -  72  ST+ X 73  /  74  STO 04        75  ST+ 05  76  X<>Y  77  DSE 00  78  GTO 01  79  RCL 05   80  /  81  2  82  LN  83  1  84  RCL 01  85  -  86  *  87  E^X-1  88  /  89  END

( 122 bytes / SIZE 008 )

 STACK INPUT OUTPUT X x Zeta(x)

Examples:

3    XEQ "ZETA"   >>>>      Zeta(3)    = 1.202056903                   ---Execution time = 21s---
-7.49 XEQ "ZETA"   >>>>    Zeta(-7.49) = 0.003312040169            ---Execution time = 24s---
1.1   XEQ "ZETA"  >>>>      Zeta(1.1)  = 10.58444847                   ---Execution time = 21s---

Notes:

Zeta(0) = -1/2
-Borwein Algorithm is really fantastic !
-You get  Zeta(1.001) in 21 seconds, which seemed impossible before...

2°)  Complex Arguments

-"ZETAZ" also uses Borwein algorithm if Re(z) > 0.5

-If  Re(z) < 0.5 , we've used    Zeta(z) = Zeta(1-z)  Pi z-1/2  Gamma((1-z)/2) / Gamma(z/2)

-The other formula may also be used but it seems to produce more roundoff-errors.

Data Registers:  R00 to R11: temp      When the program stops, the result is in R04-R05
Flags: /
Subroutines:   "GAMZ+"  ( cf "Gamma Function for the HP-41" )
"Z*Z"  "Z/Z"  "Z^Z"  ( cf "Complex Functions for the HP-41" )

-Line 128 is a synthetic TEXT0 instruction ( NOP )

 01  LBL "ZETAZ"   02  X=0?   03  X#Y?   04  GTO 00               05  .5   06  CHS   07  RTN   08  LBL 00   09  X<>Y   10  STO 07    11  STO 11   12  X<>Y   13  STO 06   14  STO 10   15  .5   16  X<=Y?   17  GTO 00   18  SIGN   19  X<>Y   20  -   21  STO 06   22  RCL 07   23  CHS   24  STO 07   25  XEQ 00   26  RCL 11   27  CHS   28  1   29  RCL 10   30  - 31  2   32  ST/ Z   33  /   34  XEQ "GAMZ+"   35  RCL 05               36  RCL 04   37  XEQ "Z*Z"   38  STO 04   39  X<>Y   40  STO 05   41  PI   42  RCL 11   43  RCL 10   44  .5   45  ST* 10   46  ST* 11   47  -   48  0   49  RDN   50  XEQ "Z^Z"   51  RCL 05   52  RCL 04   53  XEQ "Z*Z"   54  STO 04   55  X<>Y   56  STO 05   57  RCL 11   58  RCL 10   59  XEQ "GAMZ+"   60  RCL 05 61  RCL 04   62  GTO 02   63  LBL 00   64  PI   65  2   66  /   67  RCL 07               68  ABS   69  ST* Y   70  ST+ X   71  LN1+X   72  +   73  3 E10   74  LN   75  +   76  8   77  SQRT   78  3   79  +   80  LN   81  /   82  INT   83  1   84  +   85  STO 00   86  STO 02   87  LASTX   88  STO 01   89  STO 03   90  STO 04 91  CHS   92  X<>Y   93  Y^X   94  CHS   95  STO 05   96  CLX   97  STO 08               98  STO 09   99  LBL 01 100  CLST 101  RCL 00 102  RCL 07 103  CHS 104  RCL 06 105  CHS 106  XEQ "Z^Z" 107  RCL 04 108  RCL 05 109  CHS 110  STO 05 111  * 112  ST* Z 113  * 114  ST+ 08 115  X<>Y 116  ST+ 09 117  RCL 00 118  ENTER^ 119  ST+ Y 120  ST* Y 121  - 122  RCL 03 123  * 124  RCL 02 125  X^2 126  RCL 00             127  DSE X 128  "" 129  X^2 130  - 131  ST+ X 132  / 133  STO 03 134  ST+ 04 135  DSE 00 136  GTO 01 137  RCL 04 138  ST/ 08 139  ST/ 09 140  2 141  LN 142  1 143  RCL 06 144  - 145  * 146  E^X-1 147  STO 01 148  RCL 07 149  CHS 150  2 151  LN 152  * 153  1 154  RAD 155  P-R 156  ENTER^ 157  DEG 158  1 159  - 160  RCL 01             161  ST* Z 162  X<> T 163  ST* T 164  ST+ T 165  RDN 166  + 167  RCL 09 168  RCL 08 169  LBL 02 170  R^ 171  R^ 172  XEQ "Z/Z" 173  STO 04 174  X<>Y 175  STO 05 176  X<>Y 177  END

( 251 bytes / SIZE 012 )

 STACK INPUTS OUTPUTS Y y y' X x x'

Zeta(x+i.y) = x' + i.y'

Example:

7   ENTER^
-6  XEQ "ZETAZ"  >>>>  -4.135010534
RDN    -1.198478879

-So,  Zeta(-6+7.i) = -4.135010534 - 1.198478879 i

3°)  Quaternion Arguments

a) Elementary Method

-"ZETAQ" uses  Zeta(q) = 1 + 1/2q + 1/3q + ........ + 1/nq + ......     ( for Re(q) > 1)

-And if Re(q) < 0 ,    Zeta(q) = Zeta(1-q)  Pi q-1/2  Gamma((1-q)/2) / Gamma(q/2)

Data Registers:  R00 to R24: temp
Flags: /
Subroutines:     "GAMQ"  ( cf "Quaternionic Special Functions for the HP-41" )
"Q*Q"  "1/Q"  "E^Q"  ( cf "Quaternions for the HP-41" )

-Line 16 is a three-byte GTO 00

 01  LBL "ZETAQ"   02  STO 05              03  STO 17   04  RDN   05  STO 06   06  STO 18    07  RDN   08  STO 07   09  STO 19   10  X<>Y   11  STO 08   12  STO 20   13  RCL 05   14  1   15  XY   30  STO 24 31  2   32  ST/ 05   33  ST/ 06   34  ST/ 07   35  ST/ 08   36  RCL 08   37  RCL 07   38  RCL 06   39  RCL 05   40  XEQ "GAMQ"   41  STO 05              42  RDN   43  STO 06   44  RDN   45  STO 07   46  X<>Y   47  STO 08   48  21.001004   49  REGMOVE   50  XEQ "Q*Q"   51  STO 21   52  RDN   53  STO 22   54  RDN   55  STO 23   56  X<>Y   57  STO 24   58  RCL 17   59  SIGN   60  RCL 20 61  RCL 19   62  RCL 18   63  2   64  ST/ L   65  ST/ Y   66  ST/ Z   67  ST/ T   68  X<> L   69  XEQ "GAMQ"   70  XEQ "1/Q"   71  STO 05              72  RDN   73  STO 06    74  RDN   75  STO 07   76  X<>Y   77  STO 08   78  21.001004   79  REGMOVE   80  XEQ "Q*Q"   81  STO 05   82  RDN   83  STO 06   84  RDN   85  STO 07   86  X<>Y   87  STO 08   88  .5   89  ST- 17   90  RCL 20 91  RCL 19   92  RCL 18   93  PI   94  LN   95  ST* 17   96  ST* T   97  ST* Z   98  *   99  RCL 17 100  XEQ "E^Q" 101  STO 01            102  RDN 103  STO 02  104  RDN 105  STO 03 106  X<>Y 107  STO 04 108  XEQ "Q*Q" 109  RTN 110  LBL 00 111  CLX 112  STO 02 113  STO 03 114  STO 04 115  SIGN 116  STO 00 117  STO 01 118  LBL 01 119  ISG 00 120  CLX 121  RCL 08 122  RCL 07 123  RCL 06 124  RCL 00 125  LN 126  CHS 127  SIGN 128  CLX 129  RCL 05            130  X<> L 131  ST* L 132  ST* Y 133  ST* Z 134  ST* T 135  X<> L 136  XEQ "E^Q" 137  STO 09 138  CLX 139  RCL 02 140  + 141  STO 02 142  LASTX 143  - 144  ABS 145  X<>Y 146  RCL 03 147  + 148  STO 03 149  LASTX 150  - 151  ABS 152  + 153  X<>Y 154  RCL 04 155  + 156  STO 04            157  LASTX 158  - 159  ABS 160  + 161  RCL 09 162  RCL 01 163  + 164  STO 01 165  LASTX 166  - 167  ABS 168  + 169  X#0? 170  GTO 01 171  RCL 04 172  RCL 03 173  RCL 02 174  RCL 01 175  END

( 288 bytes / SIZE 025 )

 STACK INPUTS OUTPUTS T t t' Z z z' Y y y' X x x'

Zeta(x+i.y+j.z+k.t) = x' + i.y' + j.z' + k.t'

Example:

7.9   ENTER^
7.8   ENTER^
7.7   ENTER^
-7.6   XEQ "ZETAQ"    >>>>     762.9852911                                    ---Execution time = 2mn---
RDN      -14.26823437
RDN      -14.45353627
RDN      -14.63883820

-Thus,   Zeta ( -7.6 + 7.7 i + 7.8 j + 7.9 k ) = 762.9852911 - 14.26823437 i - 14.45353627 j - 14.63883820 k

Notes:

-Lines 137 to 168 may be replaced by  DSQ   1    ( cf "M-Code routines for hypercomplex numbers" )
-The execution time corresponds to this modification...

-Add  RND  after line 168 and the accuracy will be controlled by the display settings.

b) Borwein Algorithm

Data Registers:  R00 to R28: temp
Flags: /
Subroutines:     "GAMQ"  ( cf "Quaternionic Special Functions for the HP-41" )
"Q*Q"  "1/Q"  "E^Q"  ( cf "Quaternions for the HP-41" )

-Lines 30 and 137 are three-byte GTOs

 01  LBL "ZETAQ"   02  STO 05              03  STO 17   04  X^2   05  X<>Y   06  STO 06   07  STO 18   08  X^2   09  +   10  X<>Y   11  STO 07   12  STO 19   13  X^2   14  +   15  X<>Y   16  STO 08   17  STO 20   18  X^2   19  +   20  X#0?   21  GTO 00   22  CLST   23  .5   24  CHS   25  RTN   26  LBL 00   27  RCL 05   28  .5   29  X<=Y?   30  GTO 00   31  SIGN   32  CHS   33  ST* 05   34  ST* 06   35  ST* 07   36  ST* 08   37  ST- 05   38  RCL 05   39  STO 25   40  RCL 06   41  STO 26   42  RCL 07   43  STO 27   44  RCL 08   45  STO 28   46  XEQ 00   47  STO 21   48  RDN 49  STO 22   50  RDN   51  STO 23   52  X<>Y   53  STO 24   54  RCL 28              55  RCL 27   56  RCL 26   57  2   58  ST/ 25   59  ST/ T   60  ST/ Z   61  /   62  RCL 25   63  XEQ "GAMQ"   64  STO 05   65  RDN   66  STO 06   67  RDN   68  STO 07   69  X<>Y   70  STO 08   71  RCL 21   72  STO 01   73  RCL 22   74  STO 02   75  RCL 23   76  STO 03   77  RCL 24   78  STO 04   79  XEQ "Q*Q"   80  STO 21   81  RDN   82  STO 22   83  RDN   84  STO 23   85  X<>Y   86  STO 24   87  RCL 20   88  RCL 19   89  RCL 18   90  RCL 17   91  SIGN   92  CLX   93  2   94  ST/ L   95  ST/ Y   96  ST/ Z 97  ST/ T   98  X<> L   99  XEQ "GAMQ" 100  XEQ "1/Q" 101  STO 05            102  RDN 103  STO 06 104  RDN 105  STO 07 106  X<>Y 107  STO 08 108  RCL 21 109  STO 01 110  RCL 22 111  STO 02 112  RCL 23 113  STO 03 114  RCL 24 115  STO 04 116  XEQ "Q*Q" 117  STO 01 118  RDN 119  STO 02 120  RDN 121  STO 03 122  X<>Y 123  STO 04 124  .5 125  ST- 17 126  PI 127  LN 128  ST* 17 129  ST* 18 130  ST* 19 131  ST* 20 132  RCL 20 133  RCL 19 134  RCL 18 135  RCL 17 136  XEQ "E^Q" 137  GTO 02 138  LBL 00 139  PI 140  2 141  / 142  RCL 06 143  X^2 144  RCL 07 145  X^2 146  RCL 08 147  X^2 148  + 149  + 150  SQRT 151  ST* Y 152  ST+ X 153  LN1+X 154  + 155  3 E10 156  LN 157  + 158  8 159  SQRT 160  3 161  + 162  LN 163  / 164  INT 165  1 166  + 167  STO 00            168  STO 02 169  LASTX 170  STO 01 171  STO 03 172  STO 04 173  CHS 174  X<>Y 175  Y^X 176  CHS 177  STO 13 178  CLX 179  STO 09 180  STO 10 181  STO 11 182  STO 12 183  LBL 01 184  RCL 00 185  LN 186  SIGN 187  RCL 08 188  CHS 189  RCL 07 190  CHS 191  RCL 06 192  CHS 193  RCL 05 194  CHS 195  X<> L 196  ST* L 197  ST* Y 198  ST* Z 199  ST* T 200  X<> L 201  XEQ "E^Q" 202  STO 14 203  RDN 204  STO 15            205  CLX 206  RCL 04 207  RCL 13 208  CHS 209  STO 13 210  * 211  ST* 14 212  ST* 15 213  ST* Z 214  * 215  ST+ 11 216  X<>Y 217  ST+ 12 218  RCL 14 219  ST+ 09 220  RCL 15 221  ST+ 10 222  RCL 00 223  ENTER^ 224  ST+ Y 225  ST* Y 226  - 227  RCL 03 228  * 229  RCL 02 230  X^2 231  RCL 00 232  1 233  - 234  X^2 235  - 236  ST+ X 237  / 238  STO 03 239  ST+ 04 240  DSE 00 241  GTO 01 242  RCL 09 243  RCL 04 244  / 245  STO 01 246  RCL 10 247  LASTX 248  / 249  STO 02 250  RCL 11            251  LASTX 252  / 253  STO 03 254  RCL 12 255  LASTX 256  / 257  STO 04 258  RCL 08 259  RCL 07 260  RCL 06 261  2 262  LN 263  CHS 264  ST* 05 265  ST- 05 266  ST* T 267  ST* Z 268  * 269  RCL 05 270  XEQ "E^Q" 271  SIGN 272  ST* X 273  ST- L 274  X<> L 275  XEQ "1/Q" 276  LBL 02 277  STO 05 278  RDN 279  STO 06 280  RDN 281  STO 07 282  X<>Y 283  STO 08 284  XEQ "Q*Q" 285  END

( 432 bytes / SIZE 029 )

 STACK INPUTS OUTPUTS T t t' Z z z' Y y y' X x x'

Zeta(x+i.y+j.z+k.t) = x' + i.y' + j.z' + k.t'

Examples:

7.9   ENTER^
7.8   ENTER^
7.7   ENTER^
-7.6   XEQ "ZETAQ"    >>>>     762.9852917                          ---Execution time = 2m45s---
RDN      -14.26823447
RDN      -14.45353622
RDN      -14.63883832

Zeta ( -7.6 + 7.7 i + 7.8 j + 7.9 k ) = 762.9852917 - 14.26823447 i - 14.45353622 j - 14.63883832 k

-Likewise,  Zeta( 1.1 + 7 i + 8 j + 9 k ) = 0.389296030 - 0.027737071 i - 0.031699509 j - 0.035661948 k          ( in 2m06s )

Notes:

-If q is very close to 1, there could be a loss of accuracy when 2^(1-q)-1 is executed:
-Replace lines 258 to 275 by

1                   STO 09          RCL 16        ST* Y             RCL 10          CHS               ST* 06           RCL 06
RCL 05         *                    *                   1                     E^X               RCL 16           ST* 07          RCL 05
-                    STO 10          STO 09        -                     RCL 09          X=0?               ST* 08          DEG
2                    E^X-1            RAD            +                    SIN                SIGN              RCL 08          XEQ "1/Q"
LN                RCL 09          COS            STO 05           *                     /                     RCL 07

and add   STO 16 after line 150.

-The last decimals may depend on the version of "E^Q" , "Q*Q" , ....  that you are using.
-If Re(q) is large, it could be preferable to employ the 1st version of "ZETAQ".
-In all other cases, Borwein algorithm is unbeatable !

References:

[1]  Abramowitz and Stegun , "Handbook of Mathematical Functions" -  Dover Publications -  ISBN  0-486-61272-4
[2]   http://functions.wolfram.com/
[3]  P. Borwein - "An Efficient Algorithm for the Riemann Zeta Function"