Apakah ini urutan aritmetika-geometris?

11

Sebuah urutan arithmetico-geometris adalah produk elementwise dari urutan aritmatika dan barisan geometri. Sebagai contoh, 1 -4 12 -32adalah produk dari deret aritmatika 1 2 3 4dan deret geometri 1 -2 4 -8. Istilah ke-n dari barisan deret arithmetico-geometric dapat dinyatakan sebagai

an=rn(a0+nd)

untuk beberapa bilangan real , bukan nol nyata , dan integer . Perhatikan bahwa dan tidak harus bilangan bulat.dra0rd

Misalnya, urutannya 2 11 36 100 256 624 1472 3392memiliki , , dan .a0=2r=2d=3.5

Memasukkan

Daftar integer dipesan sebagai input dalam format apa pun yang wajar. Karena beberapa definisi urutan geometri memungkinkan dan menentukan , apakah input adalah urutan aritmetico-geometrik tidak akan bergantung pada apakah dibolehkan menjadi 0. Misalnya, tidak akan muncul sebagai input.n2r=000=1r123 0 0 0 0

Keluaran

Apakah itu urutan arithmetico-geometric. Keluarkan nilai kebenaran / kepalsuan, atau dua nilai konsisten yang berbeda.

Uji kasus

Benar:

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

Salah:

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
sumber
1
FYI Anda dapat menggunakan mode matematika sebaris dengan \$untuk menulis hal-hal seperti . a0
FryAmTheEggman
Apakah input dua-jangka memang memungkinkan? Tidak ada dalam kasus uji.
xnor
@xnor Secara sepele Anda dapat mengatur atau sehingga urutannya tidak unik dalam kasus itu, tetapi outputnya harus selalu benard = 0r=1d=0
Giuseppe
1
Sarankan testcase 0 2 8 24, 0 0 1, 0 0 0 1
tsh
1
1 -1 0 4 16akan menjadi kasus False yang berguna, karena ia berbagi empat elemen berturut-turut dengan masing-masing kasus Benar 1 -1 0 4 -16dan -1 -1 0 4 16.
Anders Kaseorg

Jawaban:

2

Perl 6 , 184 128 135 byte

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

Cobalah online!

Menghitung dan dari tiga elemen pertama dan memeriksa apakah urutan yang dihasilkan cocok dengan input. Sayangnya, Rakudo melempar pengecualian ketika membaginya dengan nol, bahkan ketika menggunakan angka floating-point, biaya ~ 9 byte.rd

Menghitung urutan menggunakan .an=ran1+rnd

Beberapa peningkatan diilhami oleh jawaban JavaScript Arnauld.

Penjelasan

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
sumber
2

JavaScript (ES7), 135 127 byte

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

Cobalah online!

Bagaimana?

Kami menggunakan dua tes pendahuluan untuk menyingkirkan beberapa kasus khusus. Untuk kasus utama, kami mencoba tiga kemungkinan nilai (dan nilai yang sesuai dari , yang dapat dengan mudah dideduksi) dan menguji apakah semua syarat dari urutan input cocok dengan yang diperkirakan. Karena kesalahan pembulatan potensial, kami benar-benar menguji apakah semua perbedaan kuadrat .rd<109

Kasus khusus # 1: kurang dari 3 istilah

Jika ada kurang dari 3 istilah, selalu mungkin untuk menemukan urutan yang cocok. Jadi kami memaksakan nilai kebenaran.

Kasus khusus # 2: hanya nol

Jika semua istilah sama dengan , kita bisa menggunakan , dan . Jadi kami memaksakan nilai kebenaran.0a0=0d=0r0

Kasus utama dengana0=0

Jika , urutannya dapat disederhanakan menjadi:a0=0

an=rn×n×d

Pemberian yang mana:

a1=r×da2=2r2×d

Kita tahu bahwa tidak sama dengan (jika tidak, kita akan berada dalam kasus khusus # 2). Jadi kita punya dan:d0a10

r=a22a1

utama dengana00

Kami memiliki hubungan berikut antara dan :an+1an

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

Untuk , kami memiliki: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

Kami terutama memiliki:

a2=r2a0+2r.a1

Menuju kuadrat berikut:

r2a02r.a1+a2=0

Akar siapa adalah:

r0=a1+a12a0a2a0r1=a1a12a0a2a0

Arnauld
sumber