S'agit-il d'une séquence arithmético-géométrique?

11

Une séquence arithmético-géométrique est le produit élément par élément d'une séquence arithmétique et d'une séquence géométrique. Par exemple, 1 -4 12 -32est le produit de la séquence arithmétique 1 2 3 4et de la séquence géométrique 1 -2 4 -8. Le nième terme d'une séquence arithmético-géométrique entière peut être exprimé comme

an=rn(a0+nd)

pour un nombre réel d , un réel non nul r et a0 entier 0 . Notez que r et d ne sont pas nécessairement des entiers.

Par exemple, la séquence 2 11 36 100 256 624 1472 3392a a0=2 , r=2 et d=3.5 .

Contribution

Une liste ordonnée de n2 entiers en entrée dans n'importe quel format raisonnable. Étant donné que certaines définitions de séquence géométrique autorisent r=0 et définissent 00=1 , si une entrée est une séquence arithmético-géométrique ne dépendra pas si r est autorisé à être 0. Par exemple, 123 0 0 0 0ne se produira pas en entrée.

Production

S'il s'agit d'une séquence arithmético-géométrique. Générez une valeur de vérité / fausse ou deux valeurs cohérentes différentes.

Cas de test

Vrai:

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

Faux:

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
la source
1
Pour info, vous pouvez utiliser le mode mathématique en ligne avec \$pour écrire des choses comme . a0
FryAmTheEggman
Des apports à deux termes sont-ils vraiment possibles? Il n'y en a pas dans les cas de test.
xnor
@xnor Trivially, vous pouvez définir ou d = 0 pour que les séquences ne soient pas uniques dans ce cas, mais la sortie doit toujours être véridiquer=1=0
Giuseppe
1
Suggérer un testcase 0 2 8 24, 0 0 1, 0 0 0 1
tsh
1
1 -1 0 4 16serait un faux cas utile, car il partage quatre éléments consécutifs avec chacun des vrais cas 1 -1 0 4 -16et -1 -1 0 4 16.
Anders Kaseorg

Réponses:

2

Perl 6 , 184 128 135 135 octets

{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])}

Essayez-le en ligne!

Calcule r et partir des trois premiers éléments et vérifie si la séquence résultante correspond à l'entrée. Malheureusement, Rakudo lève une exception lors de la division par zéro, même lors de l'utilisation de nombres à virgule flottante, coûtant environ 9 octets.

Énumère la séquence en utilisant unen=runen-1+rn .

Certaines améliorations sont inspirées de la réponse JavaScript d'Arnauld.

Explication

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
la source
2

JavaScript (ES7), 135 127 octets

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))

Essayez-le en ligne!

Comment?

r<dix-9

Cas spécial # 1: moins de 3 termes

S'il y a moins de 3 termes, il est toujours possible de trouver une séquence correspondante. Nous forçons donc une valeur véridique.

Cas spécial # 2: uniquement des zéros

0une0=0=0r0

une0=0

une0=0

unen=rn×n×

Qui donne:

une1=r×une2=2r2×

0une10

r=une22une1

une00

unen+1unen

unen+1=r.unen+rn+1

unen+2

unen+2=r.unen+1+rn+2=r(r.unen+rn+1)+rn+2=r2unen+2r.rn+1=r2unen+2r(unen+1-r.unen)=-r2unen+2r.unen+1

Nous avons notamment:

une2=-r2une0+2r.une1

Menant au quadratique suivant:

r2une0-2r.une1+une2=0

Dont les racines sont:

r0=une1+une12-une0une2une0r1=une1-une12-une0une2une0

Arnauld
la source