Collatz em Emacs Lisp

Funções em Emacs Lisp para estudo do problema 3x+1

Um dos maiores impactos dos computadores em matemática não foi, ao contrário do que se poderia pensar, a resolução de problemas antigos, mas a construção de novos problemas. Entre estes problemas existe um em particular que nunca teria sido enunciado se não fossem as tão malfadadas máquinas. O mais simples e mais conhecido é o chamado problema 3x+1 construído por Lothar Collatz. Seja latex2png equation a função definida nos naturais com a forma latex2png equation

A conjectura de Collatz diz o seguinte: para qualquer latex2png equation existe um latex2png equation talque latex2png equation

As funções seguintes em Emacs Lisp implementam a função, 3xp1, uma órbita, nest-3xp1 e uma tabela de órbitas, 3xp1-n-orbits de 2, 3, ..., n.

(defun 3xp1 (n)
  (cond ((= 0 (mod n 2)) (/ n 2))
        ((= 1 (mod n 2))(+ 1 (* 3 n)))))

(defun nest-3xp1 (x)
  (let (xv '())
    (while (not (eq x 1))
      (setq xv (cons x xv))
      (setq x (3xp1 x)))
      (list (length xv) (nreverse xv))))

(defun nest-3xp1-cond-small (x)
  (let (xv '() (xini x))
    (while (and (not (eq x 1)) (>= x xini))
      (setq xv (cons x xv))
      (setq x (3xp1 x)))
      (list (length xv) (nreverse xv))))

(defun 3xp1-n-orbits (n)
  (let* ((k 2))
    (princ "\n")
    (while (<= k n)
      (princ (nest-3xp1 k))
      (princ "\n")
      (setq k (+ 1 k)))))

(defun 3xp1-n-orbits-cond-small (n)
  (let* ((k 2))
    (princ "\n")
    (while (<= k n)
      (princ (nest-3xp1-cond-small k))
      (princ "\n")
      (setq k (+ 1 k)))))

O comando (3xp1-n-orbits 20) tem como output uma lista onde o primeiro elemento da lista é comprimento da órbita, o resto da lista é uma lista com a órbita:

(1 (2))
(7 (3 10 5 16 8 4 2))
(2 (4 2))
(5 (5 16 8 4 2))
(8 (6 3 10 5 16 8 4 2))
(16 (7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2))
(3 (8 4 2))
(19 (9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2))
(6 (10 5 16 8 4 2))
(14 (11 34 17 52 26 13 40 20 10 5 16 8 4 2))
(9 (12 6 3 10 5 16 8 4 2))
(9 (13 40 20 10 5 16 8 4 2))
(17 (14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2))
(17 (15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2))
(4 (16 8 4 2))
(12 (17 52 26 13 40 20 10 5 16 8 4 2))
(20 (18 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2))
(20 (19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2))
(7 (20 10 5 16 8 4 2))
nil

A função 3xp1-n-orbits-cond-small tem como critério adicional a paragem do cálculo da órbita se a sucessão de valores gerados, a partir de certa ordem, for menor que o número inteiro inicial n; isto torna o cálculo mais eficiente quando se calcula sucessivamente todas as órbitas até o inteiro n. Assim a instrução (3xp1-n-orbits-cond-small 100) dá:

(1 (2))
(6 (3 10 5 16 8 4))
(1 (4))
(3 (5 16 8))
(1 (6))
(11 (7 22 11 34 17 52 26 13 40 20 10))
(1 (8))
(3 (9 28 14))
(1 (10))
(8 (11 34 17 52 26 13 40 20))
(1 (12))
(3 (13 40 20))
(1 (14))
(11 (15 46 23 70 35 106 53 160 80 40 20))
(1 (16))
(3 (17 52 26))
(1 (18))
(6 (19 58 29 88 44 22))
(1 (20))
(3 (21 64 32))
(1 (22))
(8 (23 70 35 106 53 160 80 40))
(1 (24))
(3 (25 76 38))
(1 (26))
(96 (27 82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182 91 274
137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890
445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479
1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051
6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61
184 92 46))
(1 (28))
(3 (29 88 44))
(1 (30))
(91 (31 94 47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103
310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334
167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079
3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616
2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46))
(1 (32))
(3 (33 100 50))
(1 (34))
(6 (35 106 53 160 80 40))
(1 (36))
(3 (37 112 56))
(1 (38))
(13 (39 118 59 178 89 268 134 67 202 101 304 152 76))
(1 (40))
(3 (41 124 62))
(1 (42))
(8 (43 130 65 196 98 49 148 74))
(1 (44))
(3 (45 136 68))
(1 (46))
(88 (47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103 310
155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167
502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079
3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616
2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92))
(1 (48))
(3 (49 148 74))
(1 (50))
(6 (51 154 77 232 116 58))
(1 (52))
(3 (53 160 80))
(1 (54))
(8 (55 166 83 250 125 376 188 94))
(1 (56))
(3 (57 172 86))
(1 (58))
(11 (59 178 89 268 134 67 202 101 304 152 76))
(1 (60))
(3 (61 184 92))
(1 (62))
(88 (63 190 95 286 143 430 215 646 323 970 485 1456 728 364 182 91 274 137 412
206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336
668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719
2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077
9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122))
(1 (64))
(3 (65 196 98))
(1 (66))
(6 (67 202 101 304 152 76))
(1 (68))
(3 (69 208 104))
(1 (70))
(83 (71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103 310 155 466
233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502 251
754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619
4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154
577 1732 866 433 1300 650 325 976 488 244 122))
(1 (72))
(3 (73 220 110))
(1 (74))
(8 (75 226 113 340 170 85 256 128))
(1 (76))
(3 (77 232 116))
(1 (78))
(13 (79 238 119 358 179 538 269 808 404 202 101 304 152))
(1 (80))
(3 (81 244 122))
(1 (82))
(6 (83 250 125 376 188 94))
(1 (84))
(3 (85 256 128))
(1 (86))
(8 (87 262 131 394 197 592 296 148))
(1 (88))
(3 (89 268 134))
(1 (90))
(73 (91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593
1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319
958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102
2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244
122))
(1 (92))
(3 (93 280 140))
(1 (94))
(13 (95 286 143 430 215 646 323 970 485 1456 728 364 182))
(1 (96))
(3 (97 292 146))
(1 (98))
(6 (99 298 149 448 224 112))
(1 (100))
nil

Refs:

Palavras chave/keywords: 3x+1, Collatz, Emacs, Lisp

Criado/Created: NaN

Última actualização/Last updated: 10-10-2022 [14:25]


Voltar à página inicial.


GNU/Emacs Creative Commons License

(c) Tiago Charters de Azevedo