diff options
-rw-r--r-- | arith.c | 23 | ||||
-rw-r--r-- | arith.h | 1 | ||||
-rw-r--r-- | txr.1 | 29 |
3 files changed, 53 insertions, 0 deletions
@@ -2021,6 +2021,28 @@ val lcm(val anum, val bnum) } } +val divides(val d, val n) +{ + if (n == zero) { + if (!integerp(d)) + uw_throwf(error_s, lit("divides: ~s isn't an integer"), + d, nao); + return tnil(!zerop(d)); + } + + if (d == one) { + if (!integerp(n)) + uw_throwf(error_s, lit("divides: ~s isn't an integer"), + n, nao); + return t; + } + + if (minusp(d)) + d = neg(d); + + return eql(gcd(d, n), d); +} + val floorf(val num) { switch (type(num)) { @@ -2929,6 +2951,7 @@ void arith_init(void) reg_varl(intern(lit("*e*"), user_package), flo(M_E)); reg_varl(intern(lit("%e%"), user_package), flo(M_E)); + reg_fun(intern(lit("divides"), user_package), func_n2(divides)); reg_fun(intern(lit("bits"), system_package), func_n1(bits)); reg_fun(intern(lit("digpow"), user_package), func_n2o(digpow, 1)); reg_fun(intern(lit("digits"), user_package), func_n2o(digits, 1)); @@ -39,6 +39,7 @@ val unum(ucnum u); val cum_norm_dist(val x); val n_choose_k(val n, val k); val n_perm_k(val n, val k); +val divides(val d, val n); val tofloat(val obj); val toint(val obj, val base); val tofloatz(val obj); @@ -33713,6 +33713,35 @@ If .code lcm has any argument which is zero, it yields zero. +.coNP Function @ divides +.synb +.mets (divides < d << n ) +.syne +.desc +The +.code divides +function tests whether integer +.meta d +divides integer +.metn n . +If this is true, +.code t +is returned, otherwise +.codn nil . + +The integers 1 and -1 divide every other integer and themselves. +By established convention, every integer, except zero, divides zero. + +For other values, +.meta d +divides +.meta n +if division of +.meta n +by +.meta d +leaves no remainder. + .coNP Function @ abs .synb .mets (abs << number ) |