SchemeでJacobi記号
誰の役に立つのか分からないけど. 分岐が意外と多い.
Jacobi記号はLegendre記号の一般化になっているので, Legendre記号もこれで求められますよ.
(define (Jacobi a n) (cond ((= a 0) 0) ((= a -1) (cond ((= (modulo n 4) 1) 1) ((= (modulo n 4) 3) -1))) ((= a 2) (cond ((= (modulo n 8) 1) 1) ((= (modulo n 8) 3) -1) ((= (modulo n 8) 5) -1) ((= (modulo n 8) 7) 1))) ((< a 0) (* (Jacobi (- a) n) (Jacobi -1 n))) ((= a 1) 1) ((>= a n) (Jacobi (modulo a n) n)) ((even? a) (* (Jacobi (/ a 2) n) (Jacobi 2 n))) ((even? n) (Jacobi n a)) (else (if (= 3 (modulo n 4) (modulo a 4)) (- (Jacobi n a)) (Jacobi n a)))))