Aritmetik-geometrik bir dizi mi?


11

Bir aritmetiko-geometrik dizi , bir aritmetik dizi ve bir geometrik dizinin element olarak çarpımıdır. Örneğin 1 -4 12 -32, aritmetik dizinin 1 2 3 4ve geometrik dizinin ürünüdür 1 -2 4 -8. Bir tamsayı aritmetiko-geometrik dizisinin n. Terimi şu şekilde ifade edilebilir:

an=rn(a0+nd)

bazı gerçek sayısı , sıfır olmayan gerçek ve tamsayısı için . ve nin tamsayı olmadığını unutmayın .dra0rd

Örneğin, dizi , ve2 11 36 100 256 624 1472 3392 değerine sahiptir .a0=2r=2d=3.5

Giriş

Herhangi bir makul biçimde girdi olarak sıralı bir tamsayı listesi . Geometrik sekansın bazı tanımları izin verdiğinden ve tanımladığından , bir girişin aritmetik-geometrik sekans olup olmadığı, 0 olmasına izin verilip verilmediğine bağlı olmayacaktır .n2r=000=1r123 0 0 0 0

Çıktı

Bir aritmetiko-geometrik dizi olup olmadığı. Doğruluk / falsy değeri veya iki farklı tutarlı değer çıktılayın.

Test senaryoları

Doğru:

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

Yanlış:

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

1
\$ gibi şeyler yazmak için satır içi matematik modunu kullanabilirsiniz . a0
FryAmTheEggman

İki dönemli girdiler gerçekten mümkün müdür? Test senaryolarında hiç yoktur.
xnor

@xnor Önemsiz olarak veya ayarlayabilirsiniz, böylece sıralar bu durumda benzersiz değildir, ancak çıktı her zaman doğru olmalıdırr=1d=0
Giuseppe


1
1 -1 0 4 16True durumların her dört ardışık elemanları paylaşan beri, yararlı bir Yanlış durumda olacağını 1 -1 0 4 -16ve -1 -1 0 4 16.
Anders Kaseorg

Yanıtlar:


2

Perl 6 , 184 128 135 bayt

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

Çevrimiçi deneyin!

İlk üç elemandan ve hesaplar ve elde edilen sekansın girişle eşleşip eşleşmediğini kontrol eder. Ne yazık ki Rakudo, sıfıra nokta sayıları kullanırken bile ~ 9 baytlık maliyetle sıfıra bölerken bir istisna atar.rd

kullanarak diziyi numaralandırır .an=ran1+rnd

Bazı geliştirmeler Arnauld'un JavaScript yanıtından esinlenmiştir.

açıklama

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?

2

JavaScript (ES7), 135 127 bayt

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

Çevrimiçi deneyin!

Nasıl?

Bazı özel durumlardan kurtulmak için iki ön test kullanıyoruz. Ana durumda, üç farklı olası değerini (ve kolayca çıkarılabilen nin karşılık gelen değerlerini) deneriz ve giriş dizisinin tüm terimlerinin tahmin edilenlerle eşleşip eşleşmediğini test ederiz . Potansiyel yuvarlama hataları nedeniyle, aslında tüm kare farklılıklarının olup olmadığını test ediyoruz .rd<109

Özel durum # 1: 3 terimden az

3'ten az terim varsa, eşleşen bir sıra bulmak her zaman mümkündür. Bu yüzden gerçek bir değeri zorlarız.

Özel durum # 2: sadece sıfırlar

Tüm terimler eşitse , , ve herhangi bir . Bu yüzden gerçek bir değeri zorlarız.0a0=0d=0r0

olan ana duruma0=0

Eğer , sekans basitleştirilebilir:a0=0

an=rn×n×d

Hangi verir:

a1=r×da2=2r2×d

Bunu biliyoruz eşit değildir (aksi takdirde, özel durumda 2. olurdum). Yani ve var:d0a10

r=a22a1

ile ana duruma00

ve arasında şu ilişki var :an+1an

an+1=r.an+rn+1d

İçin ederiz:an+2

an+2=r.an+1+rn+2d=r(r.an+rn+1d)+rn+2d=r2an+2r.rn+1d=r2an+2r(an+1r.an)=r2an+2r.an+1

Özellikle:

a2=r2a0+2r.a1

Aşağıdaki ikinci dereceden liderlik:

r2a02r.a1+a2=0

Kimin kökleri:

r0=a1+a12a0a2a0r1=a1a12a0a2a0


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.