É uma sequência aritmético-geométrica?

11

Uma sequência aritmético-geométrica é o produto elementar de uma sequência aritmética e uma sequência geométrica. Por exemplo, 1 -4 12 -32é o produto da sequência aritmética 1 2 3 4e da sequência geométrica 1 -2 4 -8. O enésimo termo de uma sequência aritmético-geométrica inteira pode ser expresso como

uman=rn(uma0 0+nd)

por algum número real d , diferente de zero reais r , e inteiro uma0 0 . Note-se que r e d não são necessariamente inteiros.

Por exemplo, a sequência 2 11 36 100 256 624 1472 3392tem uma0 0=2 , r=2 , e d=3.5 .

Entrada

Uma lista ordenada de n2 números inteiros como entrada em qualquer formato razoável. Como algumas definições de sequência geométrica permitem r=0 0 e definem 0 00 0=1 , se uma entrada é uma sequência aritmético-geométrica não dependerá da possibilidade de r ser 0. Por exemplo, 123 0 0 0 0não ocorrerá como entrada.

Resultado

Se é uma sequência aritmético-geométrica. Emita um valor de verdade / falsidade ou dois valores consistentes diferentes.

Casos de teste

Verdade:

1 -4 12 -32
0 0 0
-192 0 432 -1296 2916 -5832 10935 -19683
2 11 36 100 256 624 1472 3392
-4374 729 972 567 270 117 48 19
24601 1337 42
0 -2718
-1 -1 0 4 16
2 4 8 16 32 64
2 3 4 5 6 7
0 2 8 24

Falso:

4 8 15 16 23 42
3 1 4 1
24601 42 1337
0 0 0 1
0 0 1 0 0
1 -1 0 4 16
lirtosiast
fonte
1
Para sua informação, você pode usar o modo matemático em linha \$para escrever coisas como . uma0 0
FryAmTheEggman
As entradas de dois termos são realmente possíveis? Não há nenhum nos casos de teste.
Xnor
@xnor Trivialmente você pode definir ou d = 0 para que as seqüências não são exclusivos nesse caso, mas a saída deve ser sempre truthyr=1d=0 0
Giuseppe
1
Sugerir testcase 0 2 8 24, 0 0 1, 0 0 0 1
tsh
1
1 -1 0 4 16seria um caso False útil, pois compartilha quatro elementos consecutivos com cada um dos casos True 1 -1 0 4 -16e -1 -1 0 4 16.
Anders Kaseorg

Respostas:

2

Perl 6 , 184 128 135 bytes

{3>$_||->\x,\y,\z{?grep ->\r{min (x,{r&&r*$_+(y/r -x)*($×=r)}...*)Z==$_},x??map (y+*×sqrt(y²-x*z).narrow)/x,1,-1!!y&&z/y/2}(|.[^3])}

Experimente online!

rd

uman=ruman-1+rnd

Algumas melhorias são inspiradas na resposta JavaScript de Arnauld.

Explicação

3>$_||  # Return true if there are less than three elements

->\x,\y,\z{ ... }(|.[^3])}  # Bind x,y,z to first three elements

# Candidates for r
x  # If x != 0
??map (y+*×sqrt(y²-x*z).narrow)/x,1,-1  # then solutions of quadratic equation
!!y&&z/y/2  # else solution of linear equation or 0 if y==0

?grep ->\r{ ... },  # Is there an r for which the following is true?

    ( ,                         ...*)  # Create infinite sequence
     x  # Start with x
       {                       }  # Compute next term
        r&&  # 0 if r==0
                (y/r -x)  # d
           r*$_  # r*a(n-1)
                          ($×=r)  # r^n
                +        *  # r*a(n-1)+d*r^n
                                     Z==$_  # Compare with each element of input
min  # All elements are equal?
Nwellnhof
fonte
2

JavaScript (ES7), 135 127 bytes

a=>!([x,y,z]=a,1/z)|!a.some(n=>n)|[y/x+(d=(y*y-x*z)**.5/x),y/x-d,z/y/2].some(r=>a.every((v,n)=>(v-(x+n*y/r-n*x)*r**n)**2<1e-9))

Experimente online!

Quão?

rd<10-9

Caso especial nº 1: menos de 3 termos

Se houver menos de três termos, é sempre possível encontrar uma sequência correspondente. Então, forçamos um valor verdadeiro.

Caso especial nº 2: apenas zeros

0 0uma0 0=0 0d=0 0r0 0

uma0 0=0 0

uma0 0=0 0

uman=rn×n×d

Que dá:

uma1=r×duma2=2r2×d

d0 0uma10 0

r=uma22uma1

uma0 00 0

uman+1uman

uman+1=r.uman+rn+1d

uman+2

uman+2=r.uman+1+rn+2d=r(r.uman+rn+1d)+rn+2d=r2uman+2r.rn+1d=r2uman+2r(uman+1-r.uman)=-r2uman+2r.uman+1

Temos notavelmente:

uma2=-r2uma0 0+2r.uma1

Levando ao seguinte quadrático:

r2uma0 0-2r.uma1+uma2=0 0

Cujas raízes são:

r0 0=uma1+uma12-uma0 0uma2uma0 0r1=uma1-uma12-uma0 0uma2uma0 0

Arnauld
fonte