JPhrases/NumbersCounting
8A. Numbers & 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) [[[Phrases/References#1|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 [[[Phrases/References#1|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"_)@= # ] " 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 [[[Phrases/References#3|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 precision.