racket/collects/math/private/number-theory/polygonal.rkt
2012-11-23 16:09:28 +01:00

57 lines
1.7 KiB
Racket

#lang typed/racket/base
(require "quadratic.rkt"
(only-in "number-theory.rkt" perfect-square)
"types.rkt")
(provide triangle-number triangle-number?
square-number?
pentagonal-number pentagonal-number?
hexagonal-number hexagonal-number?
heptagonal-number heptagonal-number?
octagonal-number octagonal-number?)
(: triangle-number : Natural -> Natural)
(define (triangle-number n)
(quotient (* n (+ n 1)) 2))
(: triangle-number? : Natural -> Boolean)
(define (triangle-number? n)
(not (null? (quadratic-natural-solutions 1/2 1/2 (- n)))))
(: square-number? : Natural -> Boolean)
(define (square-number? n)
(and (perfect-square n) #t))
(: pentagonal-number : Natural -> Natural)
(define (pentagonal-number n)
(assert (quotient (* n (- (* 3 n) 1)) 2) natural?))
(: pentagonal-number? : Natural -> Boolean)
(define (pentagonal-number? n)
(not (null? (quadratic-natural-solutions 3/2 -1/2 (- n)))))
(: hexagonal-number : Natural -> Natural)
(define (hexagonal-number n)
(assert (* n (- (* 2 n) 1)) natural?))
(: hexagonal-number? : Natural -> Boolean)
(define (hexagonal-number? n)
(not (null? (quadratic-natural-solutions 2 -1 (- n)))))
(: heptagonal-number : Natural -> Natural)
(define (heptagonal-number n)
(assert (quotient (* n (- (* 5 n) 3)) 2) natural?))
(: heptagonal-number? : Natural -> Boolean)
(define (heptagonal-number? n)
(not (null? (quadratic-natural-solutions 5/2 -3/2 (- n)))))
(: octagonal-number : Natural -> Natural)
(define (octagonal-number n)
(assert (* n (- (* 3 n) 2)) natural?))
(: octagonal-number? : Natural -> Boolean)
(define (octagonal-number? n)
(not (null? (quadratic-natural-solutions 3 -2 (- n)))))