fork download
  1. ; floyd's triangle
  2.  
  3. (define (floyd1 n)
  4. (let ((num 1))
  5. (do ((i 0 (+ i 1))) ((<= n i))
  6. (do ((j 0 (+ j 1))) ((< i j))
  7. (display num)
  8. (display (if (< j i) #\space #\newline))
  9. (set! num (+ num 1))))))
  10.  
  11. (floyd1 10)
  12.  
  13. (define (isqrt n)
  14. (if (not (and (positive? n) (integer? n)))
  15. (error 'isqrt "must be positive integer")
  16. (let loop ((x n))
  17. (let ((y (quotient (+ x (quotient n x)) 2)))
  18. (if (< y x) (loop y) x)))))
  19.  
  20. (define (square? n)
  21. (define bitwise-and logand)
  22. (let ((m (modulo n 128)))
  23. (if (positive? (bitwise-and (* m #x8bc40d7d) (* m #xa1e2f5d1) #x14020a)) #f
  24. (let ((large-mod (modulo n 3989930175))) ; (* 63 25 11 17 19 23 31)
  25. (and (let ((m (modulo large-mod 63)))
  26. (zero? (bitwise-and (* m #x3d491df7) (* m #xc824a9f9) #x10f14008)))
  27. (let ((m (modulo large-mod 25)))
  28. (zero? (bitwise-and (* m #x1929fc1b) (* m #x4c9ea3b2) #x51001005)))
  29. (let ((m (* #xd10d829a (modulo large-mod 31))))
  30. (zero? (bitwise-and m (+ m #x672a5354) #x21025115)))
  31. (let ((m (modulo large-mod 23)))
  32. (zero? (bitwise-and (* m #x7bd28629) (* m #xe7180889) #xf8300)))
  33. (let ((m (modulo large-mod 19)))
  34. (zero? (bitwise-and (* m #x1b8bead3) (* m #x4d75a124) #x4280082b)))
  35. (let ((m (modulo large-mod 17)))
  36. (zero? (bitwise-and (* m #x6736f323) (* m #x9b1d499) #xc0000300)))
  37. (let ((m (modulo large-mod 11)))
  38. (zero? (bitwise-and (* m #xabf1a3a7) (* m #x2612bf93) #x45854000)))
  39. (let ((root (isqrt n))) (if (= (* root root) n) root #f)))))))
  40.  
  41. (define (floyd2 n)
  42. (let ((row 0))
  43. (do ((num 1 (+ num 1))) ((= row n))
  44. (display num)
  45. (if (square? (+ (* 8 num) 1))
  46. (begin (display #\newline)
  47. (set! row (+ row 1)))
  48. (display #\space)))))
  49.  
  50. (floyd2 10)
Success #stdin #stdout 0.05s 8268KB
stdin
Standard input is empty
stdout
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55