RosettaCodeData/Task/Arithmetic-derivative/Racket/arithmetic-derivative.rkt
2026-04-30 12:34:36 -04:00

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)))))