48 lines
1.1 KiB
Racket
48 lines
1.1 KiB
Racket
#lang racket/base
|
|
|
|
(require
|
|
math/number-theory
|
|
racket/contract/base
|
|
racket/match)
|
|
|
|
(provide
|
|
(contract-out
|
|
[δ (-> rational? rational?)]))
|
|
|
|
(define (∂ N)
|
|
(let ([|N| (inexact->exact (abs N))])
|
|
(for/sum ([power (in-list (factorize |N|))])
|
|
(match-define (list prime expt) power)
|
|
(/ expt prime))))
|
|
|
|
(define (δ m/n)
|
|
(define m (numerator m/n))
|
|
(define n (denominator m/n))
|
|
(cond
|
|
[(= 1 n) (* m (∂ m))]
|
|
[else
|
|
(/ (- (* n (δ m)) (* m (δ n)))
|
|
(* n n))]))
|
|
|
|
(module+ test
|
|
(require
|
|
racket/format
|
|
racket/string)
|
|
|
|
(define (align-number n width)
|
|
(~a n #:min-width width #:align 'right))
|
|
|
|
(displayln "task: show arithmetic derivatives of the integers -99..100")
|
|
(define cols (build-list 10 add1))
|
|
(for ([row (in-inclusive-range -10 9)])
|
|
(displayln
|
|
(string-join
|
|
(map (lambda (col) (align-number (δ (+ (* 10 row) col)) 5))
|
|
cols)
|
|
" │ ")))
|
|
(newline)
|
|
|
|
(displayln "stretch task: show arithmetic derivatives of 10^m / 7 for m=1..20")
|
|
(for ([n (in-inclusive-range 1 20)])
|
|
(displayln
|
|
(format "D(10^~a) / 7 = ~a" (align-number n 2) (/ (δ (expt 10 n)) 7)))))
|