Desafio da Sequencia de Números

Lógica

Tentando resolver o problema proposto no grupo do R Brasil programadores.

Afonso Campos true
2021-08-13

Esse desafio foi publicado no grupo do R Brasil e eu consegui chegar na resposta. Certamente há maneiras computacionalmente mais eficientes para resolver.

O Enunciado

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

A Minha Resolução no R

Passo 1

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

Passo 2

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

Passo 3

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

Passo 4

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