I'm sure this isn't what you are looking for but I had some time today, so I 
calculated Nivens constant using the zeta function and bernoullis. My guess is 
that it is computationally less expensive than using q:

Step 1: Generate Bernoulli Numbers. We get a list of (even) Bernoulli numbers 
up to the given number.

NB. Generates all even bernoulli numbers up to y
generatebernoulli=: 3 : 0
arr=. (y + 2) $ 0
arr=. (1) 1} arr

bernoulliList=. 1
flag=. 1 NB. true
a=. 1
b=. 1
c=. _2
d=. 1
size=. (2 * y) - 2
for_j. i. size do.
  if. flag = 1 do.
    a=. a + 1
    b=. 4 * b
    c=. _1 * c
    d=. c * (b - 1)
    k=. a
    while. k > 0 do.
      tmp0=. k { arr
      tmp1=. (k+1) { arr
      
      arr=. (tmp0 + tmp1) k} arr
      k=. k - 1
    end.
  else.
    k=. 1
    while. k < a do.
      tmp0=. k { arr
      tmp1=. (k-1) { arr
      arr=. (tmp0 + tmp1) k} arr
      k=. >: k
    end.
    bernoulliList=. bernoulliList, (x: ((a-1){arr) % d)
  end.
  flag=. 2 | >: flag
end.
bernoulliList
)

STEP 2: Use the relation between bernoulli numbers and zeta to write a verb
that computes the zeta (2 *y), for argument y. left argument, x, should be the 
previously
calculated bernoulli number list.

NB. Calculates Even Zeta, i.e. Zeta (2 *y).
NB. Uses the relation between even zeta values and bernoulli numbers.
calcevenzeta =: 4 : 0
bernoullis =. x
m =. 2 * y
(_1^(y+1)) * ((y{bernoullis) * (2 * o. 1)^m) % (2 * ! m)

)


STEP 3: For odd numbers we have to do raw computation. So compute zeta(y) for 
200 terms.
NB. Calculates zeta (y), but should be used for odd y
calcoddzeta =: 3 : 0
arr =.%>: i. 200 NB. 200 is enough
+/arr ^ y
)

STEP 4: calculate Nivens constant

bernoullilist =: generatebernoulli 100 NB. we don't even need this many

zetaapproximations =:(bl&calcevenzeta@:-:)`calcoddzeta@.(1&=(2&|)) NB. two 
cases, even or odd integers.

NIVENS_CONSTANT =: 1+ +/ 1- % zetaapproximations"(0) 2 + i. 100 NB. we will 
approximate with the first 100 integers, but I doubt this many is necessary.

this gives 1.7052 

I wrapped all the above in a single verb and ran timespacex

timespacex 'allcalc 100' NB. calculate first 100 terms only.
0.044685 34240

Doing raw calcs with q: is way more expensive:

timespacex 'mean >./@(0&,)@(_&q:)"0 }.i.1e5'
1.5124 9.04083e6

--------------------------------------------
On Wed, 7/6/16, jonghough via Programming <[email protected]> wrote:

 Subject: Re: [Jprogramming] Niven's constant
 To: [email protected]
 Date: Wednesday, July 6, 2016, 12:40 AM
 
 
 
 Hi,
 
 
 I don't have my PC at hand now, but what is
 the problem with your calculation?
 
 I had never heard of Nivens constant, but
 looking at Wikipedia there is a formula for it containing
 the zeta function.
 
 Why not
 use this formula?
 
 Zeta 2 3
 4 are well known constants, and you can calculate or
 hardcode the values for other even arguments, 
https://en.m.wikipedia.org/wiki/Particular_values_of_Riemann_zeta_function
 
 
 You might need to
 calculate bernoulli numbers.
 
 
 For odd values I think you
 need to calculate from scratch, but since zeta 14 is almost
 1 you don't need to do too many calculations, just from
 5 to 15, say. 
 
 
 This is just thinking out loud. But my main
 point is you only probably need the first 15 or so zeta
 values before convergence is 'good enough'.
 
 
 Regards,
 
 Jon
 
 
 
 
 
 
 On Wed, Jul
 6, 2016 at 12:12 AM +0900, "mikel paternain"
 <[email protected]>
 wrote:
 
 
 
 
 
 
 
 
 
 
 
 ________________________________
 De: mikel paternain 
 Enviado:
 domingo, 3 de julio de 2016 12:07:37
 Para:
 [email protected]
 Asunto: Niven's constant
 
 Hi,
 
 I need improve the code for calculating
 Niven's constant. Could you help me?
 
 A first test is (see "Computo ergo
 sum" section in JoJ):
 
 exp=:+/"1@=@q:
 max=:>./
 a=.max@exp(2+1.1000)
 C=.(+/%#)a
 
 Thanks in advance,
 
 Mikel Paternain
 
 
 ----------------------------------------------------------------------
 For information about J forums see http://www.jsoftware.com/forums.htm
 
 
 
 
 ----------------------------------------------------------------------
 For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to