Tentando resolver o problema proposto no grupo do R Brasil programadores.
Esse desafio foi publicado no grupo do R Brasil e eu consegui chegar na resposta. Certamente há maneiras computacionalmente mais eficientes para resolver.
Desafio: criar um programa de computador que faça a sequência abaixo.
Que comecem os jogos. 🙂
Uma Sequência interessante, obtida de forma curiosa! (baseada na sequência dos números primos, adição, multiplicação, e na menor diferença POSITIVA para o quadrado perfeito mais próximo) Vamos lá:
Os três primeiros números primos:
2, 3, 5
Fazemos:
2 + 3 × 5 = 17
Procuramos o maior quadrado perfeito MENOR do que 17.
É 16
Fazemos
17 - 16 = 1
Então o primeiro número da sequência é 1
Construindo o segundo número da sequência (vejam o trabalhão que dá):
Pegamos os três próximos números primos (7, 11, 13) e fazemos:
7 + 11 × 13 = 150
O maior quadrado perfeito MENOR do 150 é 144
150 - 144 = 6
6 é o segundo número da sequência
O terceiro número da sequência:
Fazemos
17 + 19 × 23 = 454
O quadrado perfeito mais próximo (menor do que 454) é 441
Então
454 - 441 = 13
13 é o terceiro número da sequência Para o quarto número da sequência é só usar os números primos 29, 31, 37 , e seguir a mesma lógica. Para o quinto número da sequência: usar os números primos 41, 43, 47
Considerando que eu quero que no final sejam gerados 50 números. Para isso, eu tenho que ter inicialmente 3 vezes valor desejado inicial em números primos.
# Eu quero que no final ele gere 50 números
desejado <- 50
# Tenho que ter inicialmente 3 para cada número desejado que sofrerão as operacoes de soma e multiplicação
tamanho <- desejado * 3
num <- 0
primos <- NULL
primonum <- NULL
# Obtendo os números primos com um loop
while(num >= 0 ){
if (num == 2) {
primonum <- num
} else if (any(num %% 2:(num-1) == 0)) {
FALSE
} else {
primonum <- num
}
temp <- primonum
num <- num + 1
primos <-unique(c(temp, primos))
if(length(primos) == tamanho){
primos <- sort(primos)
break
}
}
primos
[1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
[17] 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131
[33] 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223
[49] 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311
[65] 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409
[81] 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503
[97] 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613
[113] 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719
[129] 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827
[145] 829 839 853 857 859 863
A operação a ser aplicada e sempre o primeiro + segundo * terceiro número da sequencia.
# primeiro mais o segundo vezes o terceiro
tamprimos <- length(primos)
primeiro <- primos[seq(1, tamprimos, by = 3)]
segundo <- primos[seq(2, tamprimos, by = 3)]
terceiro <- primos[seq(3, tamprimos, by = 3)]
operacao <- primeiro + segundo * terceiro
operacao
[1] 17 150 454 1176 2062 3652 5250 7466 10500
[10] 12424 18074 22638 27378 32572 38212 47252 53584 60730
[19] 71004 78108 90234 99532 117270 127076 141734 154816 171772
[28] 187044 199346 213900 233740 251488 272992 305220 325462 348668
[37] 365406 382536 412794 430974 456282 485074 523422 549810 576828
[46] 609120 656896 681442 716496 742174
A raiz quedrada de cada numero da operação do passo 2 que não pode ter resto. Caso tenha, buscar o numero inteiro anterior mais próximo que satisfaça essa condição.
raizresult <- NULL
for(i in operacao){
num <- i
while (num >=0) {
if(sqrt(num) %% 1 == 0){
temp2 <- num
break
}else{num <- num - 1}
}
raizresult <- c(raizresult, temp2)
}
raizresult
[1] 16 144 441 1156 2025 3600 5184 7396 10404
[10] 12321 17956 22500 27225 32400 38025 47089 53361 60516
[19] 70756 77841 90000 99225 116964 126736 141376 154449 171396
[28] 186624 198916 213444 233289 251001 272484 304704 324900 348100
[37] 364816 381924 412164 430336 455625 484416 522729 549081 576081
[46] 608400 656100 680625 715716 741321
Subitrair o passo 2 do passo 3.
# resultado final
final <- operacao - raizresult
final
[1] 1 6 13 20 37 52 66 70 96 103 118 138 153 172 187 163
[17] 223 214 248 267 234 307 306 340 358 367 376 420 430 456 451 487
[33] 508 516 562 568 590 612 630 638 657 658 693 729 747 720 796 817
[49] 780 853