Here's another trivial convenience function:

```
divides? : int → int → boolean
divides? a b = mod b a == 0
```

This makes divisibility tests read more like the mathematical `a | b`

notation:

`prime? n = n ≥ 2 && not (some (2 .. isqrt n) (divides? _ n))`

Argument order and name are debatable. (I find the `?`

suffix surprisingly uncomfortable, perhaps because `divides?`

is a binary mathematical predicate, so I expect it to be a single-character infix operator like `< ≤ ∈ ⊂`

, not an “ordinary” function.)

I initially wrote `divides?`

off as a feature useful only in toy problems. It certainly comes up a lot in Project Euler problems, since those (as befits their name) are heavy on number theory. But even in real code, many (most?) uses of `mod`

are divisibility tests. So `divides?`

may be worth having, because it expresses this directly rather than via a slightly awkward use of `mod`

.

(Real-world divisibility tests, incidentally, are often used to do something every nth iteration, e.g. updating a progress indicator, flushing a buffer, updating a cache. This pattern is so common that it might deserve an abstraction of its own. However, it's often a mistake — many periodic operations should be periodic in time, not number of iterations. So there's another useful operation: `periodically `

.)
`interval` `timer`

Sorry, I can never remember. Which kind of integer division were you talking about: floor, ceiling, truncating, or rounding?

ReplyDeleteNone of them. We're testing for divisibility, not pretending it's always possible.

ReplyDelete