# Maxima/Numbers

## Check

(%i1) load(to_poly);
(%o1)  home/a/maxima/share/to_poly_solve/to_poly.lisp
(%i2) r;
(%o2) r
(%i3) isreal_p(r);
(%o3) true     /*  When I use unspecified variables, Maxima seems to assume that they are real */
(%i4) z:x+y*%i;
(%o4) %i y + x
(%i5) isreal_p(z);
(%o5) isreal_p(%i y) /* maxima can't check if it is real or not */
(%i6) isreal_p(x);
(%o6) true
(%i7) isreal_p(y);
(%o7) true
(%i8) complex_number_p(z);
(%o8) false
(%i9) declare(z, complex);
(%o9) done
(%i10) complex_number_p(z);
(%o10)   false /* still not complex */                                                                                                              true


## Random numbers

  bfloat(random(10^fpprec) / 10^fpprec); /* random bfloat with fpprec decimal digits in the range 0 to 1 */


## Number types

### Binary numbers

(%i1) ibase;
(%o1) 10
(%i2) obase;
(%o2) 10
(%i3) ibase:2;
(%o3) 2
(%i4) x=1001110;
(%o4) x=78


### Complex numbers

#### Argument

Principial value of argument of complex number in turns carg produces results in the range (-pi, pi] . It can be mapped to [0, 2*pi) by adding 2*pi to the negative values

carg_t(z):=
block(
[t],
t:carg(z)/(2*%pi),  /* now in turns */
if t<0 then t:t+1, /* map from (-1/2,1/2] to [0, 1) */
return(t)
)$ On can order list of complex points according to it's argument : l2_ordered: sort(l2, lambda([z1,z2], is(carg(z1) < carg(z2))))$


### rational numbers

• rat
• ratp

Rationalize with limit denominator:[1]

limit_denominator(x, max_denominator):=
block([p0, q0, p1, q1, n, d, a, q2, k, bound1, bound2, ratprint: false],
[p0, q0, p1, q1]: [0, 1, 1, 0],
[n, d]: ratexpand([ratnum(x), ratdenom(x)], 0),
if d <= max_denominator then x else
(catch(
do block(
a: quotient(n, d),
q2: q0+a*q1,
if q2 > max_denominator then throw('done),
[p0, q0, p1, q1]: [p1, q1, p0+a*p1, q2],
[n, d]: [d, n-a*d])),
k: quotient(max_denominator-q0, q1),
bound1: (p0+k*p1)/(q0+k*q1),
bound2: p1/q1,
if abs(bound2 - x) <= abs(bound1 - x) then bound2 else bound1))$ ## Predicate functions (%i1) is(0=0.0); (%o1) false  Compare : (%i1) a:0.0$
(%i2)is(equal(a,0));
(%o2) true


List of predicate functions ( see p at the end ) :

• abasep
• alphacharp
• alphanumericp
• atom
• bfloatp
• blockmatrixp
• cequal
• cequalignore
• cgreaterp
• cgreaterpignore
• charp
• clessp
• clesspignore
• complex_number_p from to_poly package
• constantp
• constituent
• diagmatrixp
• digitcharp
• disjointp
• elementp
• emptyp
• evenp
• featurep
• floatnump ( compare : isreal_p)
• if
• integerp
• intervalp
• is
• isreal_p from to_poly package
• lcharp
• listp
• listp
• lowercasep
• mapatom
• matrixp
• matrixp
• maybe
• member
• nonnegintegerp
• nonscalarp
• numberp
• oddp
• operatorp
• ordergreatp
• orderlessp
• picture_equalp
• picturep
• poly_depends_p
• poly_grobner_subsetp
• polynomialp
• prederror
• primep
• ratnump
• ratp
• scalarp
• sequal
• sequalignore
• setequalp
• setp
• stringp
• subsetp
• subvarp
• symbolp
• symmetricp
• taylorp
• unknown
• uppercasep
• zeroequiv
• zeromatrixp
• zn_primroot_p

• declare[2]
• property:
• rational, irrational, real, imaginary, complex,
• even, odd,
• decreasing, increasing
• evenfun, oddfun

## Number Theory

There are functions and operators useful with integer numbers

### Elementary number theory

In Maxima there are some elementary functions like the factorial n! and the double factorial n!! defined as ${\displaystyle {\frac {n!}{k!}}}$ where ${\displaystyle k}$ is the greatest integer less than or equal to ${\displaystyle n/2}$

#### Divisibility

Some of the most important functions for integer numbers have to do with divisibility:

gcd, ifactor, mod, divisors...


all of them well documented in help. you can view it with the '?' command.

Function ifactors takes positive integer and returns a list of pairs : prime factor and its exponent. For example :

a:ifactors(8);
[[2,3]]


It means that : ${\displaystyle 8=2^{3}\,}$

#### Other Functions

Continuus fractions :

(%i6) cfdisrep([1,1,1,1]);
(%o6) 1+1/(1+1/(1+1/1))
(%i7) float(%), numer;
(%o7) 1.666666666666667