>> << Ndx Usr Pri Phr Dic Rel Voc !: wd Help Phrases

# 8A. Numbers And Counting

Constants such as π (`1p1`), half-π (`1r2p1`), integers expressed in base sixteen (`16b2a` for `42`), complex numbers in terms of real and imaginary parts (`2j3`), and complex numbers in terms of magnitude and angle in degrees or radians (`3ad90` and `3ar1`) are commonly needed in programming.

Constant functions are also needed, as in `odd=: 1:+2:*i.`. The phrase `c"r` produces a constant function of rank `r` for any constant `c` (numeric, or other such as characters or boxed).

Many other constants, such as the reciprocal of π (`1p_1`), the multipliers used in converting from radians to degrees (`180p_1`) and from degrees to radians (`1r180p1`), the kth prime(`p: k`), and the list of prime factors of an integer (`q: i`) are commonly used.

The following phrases illustrate the production of various numbers, including such lists and tables as the binomial coefficients, various grids, Stirling numbers, primes and prime factors:

`n0 =: pi=: 1p1` | π
`v1 =: PI=: 1p1"_` | Other ranks are possible
`n2 =: 2p1 1r2p1 1r6p1` | List of multiples of π
`n3 =: 2p_1 1r2p_1 1r6p_1` | Multiples of reciprocal π
`n4 =: 1x1` | Euler’s number (2.71828 ...)
`v5 =: 1x1 1x_1 _1x_1"0` | List function of rank zero
`m6 =: pitimes=: 1p1&*` | Like `o.` but infinite rank
`m7 =: ln=: 1x1&^.` | Like `^.` (natural log)
`m8 =: ln=: 1x1"_ ^. ]` | "
`m9 =: [:^ 0j2p1&% * i.` | Roots of unity; e.g. `m9 5`
`m10=: 1:=1:^m9` | Roots of unity; e.g. `m10 5`
`m11=: sbase=: %:@(2p1&%)* %&1x1 ^]` | Stirling’s approximation, base term
`m12=: scorr=: 1 1r12 1r288 _139r51840 _571r2488320&p.@%` | Stirling’s approximation, correction
`m13=: stirg =: sbase * scorr` | Stirling’s approx for Γ(y) [AS[1] 6.1.37]
`n14=: |1-(!10)%stirg 1+10` | Relative error for !10
`m15=: stirf =: ^@(1r12&%) *%:@(2p1&*) * %&1x1 ^ ]` | Stirling’s approx to !y [AS[1] 6.1.38]
`n16=: |1-(!10)%stirf 10` | Relative error for !10
`m17=: even=: 2:*i.` | Even integers
`m18=: odd=: >:@even` | Odd integers
`m19=: odd=: 1:+2:*i.` | Odd integers
`m20=: grid=: +`(*i.)/` | `grid b,s,n` is From b step s for n
`m21=: Ai=: >:@i.` | Augmented integers (1 to y)
`m22=: +/\@($&1)` | " (but not negint arg)
`m23=: Ei=: i.@>:` | Extended integers (0 to y)
`m24=: Si=: Ei@+: - ]` | Symmetric integers (-y to y)
`m25=: bc=: Ei ! ]` | Binomial coefficients
`m26=: (0&,+,&0)^:([`1:)` | "
`m27=: bct=: Ei !/ Ei` | Pascal’s triangle (bc table)
`m28=: !/~@Ei` | "
`m29=: !~/~@Ei` | Pascal’s triangle
`m30=: (0&,+,&0)^:(i.`1:)` | "
`m31=: 1 1&([: +//. */)^:(i.`1:)` | "
`m32=: +/\@(|.!.0)^:(i.`($&1))` | "
`m33=: odometer=: #: i.@(*/)` | All #s in radix y (odometer)
`m34=: >@,@{@(i.&.>"_)` | " Try `m34 10 10`
`m35=: ,:@i.@0:`([: ,/ i.@{. ,."0 2$:@}.)@.(*@#)` | " Try `m35 2 2 2`
`m36=: tt=: #:@i.@(2&^)` | Truth table of order y
`m37=: odometer@($&2)` | "
`m38=: >@,@{@($&(<0 1))` | "
`m39=: ,:@i.`([: ,/ i.@2: ,."0 2 $:@<:)@.*` | "
`m40=: [:|:2&^($ #&0 1)"(0)2&^@i.@-` | "
`m41=: (i.@# = i.~) # ]` | Nub (all distinct items of) `~.`
`m42=: ~: # ]` | " Try `m42 2 7 1 8 2 8`
`m43=: +./@(</\"1"_)@= # ]` | " Try `m43 ;:'all in all'`
`m44=: ~.@(i.~) { ]` | "
`m45=: {./.~` | "
`m46=: ({.;#)/`.~ | Nub and count
`m47=: #/.~` | " Try `m47 2 7 1 8 2`
`m48=: +/"1@=` | " Try `m48 ;: 'all in all'`
`m49=: 1: #. =` | "
`m50=: ifb=: # i.@#` | Index from boolean
`d51=: bfi=: i.@[ e. ]` | Boolean from index; e.g. `0 d51 5 7`
`d52=: 1:`]`($&0@[)}` | Boolean from index
`m53=: cfpv=: #;.1` | Count from partition vector
`m54=: pvfc=: [: ; {.&1&.>` | Partition vector from count
`m55=: i.@(+/) e. 0&,@(+/\)` | "
`n56=: 2147483647=p: 105097564` | The 105,097,564-th prime (0 origin)
`m57=: lp=: p:@i.` | List first y primes
`m58=: fotp=: (2&(_2:=-/\)#}:)@lp` | First of twin primes among first y
`m59=: p:^:_1` | Number of primes less than y
`n60=: 2 2 2 3 5 -: q: 120` | Prime factorization of 120
`m61=: taut=: -: */@q:` | y = product of factors. Try `m61 12345`
`m62=: dpe=: (~. ,: 1: #. =)@q:` | Distinct primes with exponents
`m63=: |:@(({.,#)/.~)@q:` | "
`m64=: taut=: = */@(^/)@dpe` | y = product over powers. Try `m64 120`
`m65=: = */ .^/@dpe` | "
`m66=: divisors=: /:~ @ , @ > @ (*/&.>/) @ ((^ i.@>:)&.>/) @ (__&q:)` | Divisors of`y` . Try`m66 900`
`m67=: /:~@~.@(*/ .^"1 tt@#)@q:` | "
`m68=: /:~ @ , @: (*/&>) @ {@ (<@(1&,)@(*/\)/.~) @ q:` | "
`m69=: >:@i. ([ #~ 0: = |) ]` | "
`m70=: perfect=: +: = +/@divisors` | Perfect number test
`m71=: 1: = #@q:` | Prime test
`d72=: q:@[ -: -.&q:` | Relatively prime test
`d73=: 1: = +.` | "
`m74=: totient=:* -.@%@~.&.q:` | Totient [GKP[3] 4.53]
`m75=: */@(^/-(^<:)/)@dpe` | "
`m76=: [: +/ 1: = (+.i.)` | "
`m77=: [:/:~[:~.]|[:*:[:m50]m73[:i.]` | Quadratic residues
`d78=: L=: [:{&_1 1|~e.(|*:@}.@i.)@]` | Legendre symbol
`d79=: L * L~` | Quadratic reciprocity
`d80=: cfe=:<.@(([:%1:|])^:(i.@[`]))` | x terms of continued fraction expansion of y
`m81=: rapprox=: (, % +.)&1"0` | Rational approximation to y
`m82=: [:>:[:m50]m72"0[:>:[:i.[:<:]` | Numbers prime to y
`m83=: 3 : '<.@o.&.((10^y.)&*) 1'` | y digits of π
`m84=: [: +/ %@!@i.` | y digits of e
`d85=: 4 : '-:@(+y.&%)^:(>.2^.1>.x.-16) x:%:y.'` | x digits of the square root of integer y

The last three phrases illustrate operations on extended precision arguments. (`0j_40 ": y` formats`y` in exponential notation using 40 digits.)

       0j_40 ": m83 40x
    3.1415926535897932384626433832795028841971e0
       0j_40 ": m84 40x
    2.7182818284590452353602874713526624977572e0
       0j_40 ": 40 d85 2
    1.4142135623730950488016887242096980785697e0

`m83` exploits the fact that `<.@o.` produces extended integer results on extended integer arguments, and uses scaling to effect the desired computation.

`m84` uses the reciprocal factorial power series to compute `e`, and produces extended precision results if given extended precision arguments.

`d85` uses Newton's iteration to compute a rational approximation of the square root of integer `y`, accurate to x digits. The initial estimate is `x:%:y`, a rational approximation of the finite-precision square root of `y`. The number of iterations is the base-2 log of `x-16`, based on that the number of accurate digits doubles on every iteration and that the initial estimate has 16-digits of accuracy.

>> << Ndx Usr Pri Phr Dic Rel Voc !: wd Help Phrases