Formula pecahan utama yang aneh

17

Diberikan bilangan bulat positif n keluaran bilangan bulat a dan b (membentuk pecahan tereduksi a / b ) sedemikian rupa sehingga:

Formula a / b = produk k = 1 hingga n: (p_k ^ 2 - 1) / (p_k ^ 2 + 1)

Di mana p k adalah bilangan prima k th (dengan p 1 = 2).

Contoh:

1   -> 3, 5
2   -> 12, 25
3   -> 144, 325
4   -> 3456, 8125
5   -> 41472, 99125
15  -> 4506715396450638759507001344, 11179755611058498955501765625
420 -> very long

Pemeriksaan prime probabilistik diperbolehkan, dan tidak apa-apa jika jawaban Anda gagal karena keterbatasan dalam tipe integer bahasa Anda.


Kode terpendek dalam byte menang.

orlp
sumber
Bisakah kita juga output 3.0bukan 3?
Adnan
2
@AndN Saya kira ... Pastikan program Anda benar untuk semua input, dan tidak menderita kesalahan floating point untuk input besar.
orlp
Bisakah kita menampilkan adan bsebagai tipe rasional?
Alex A.
2
@AlexA. Hanya jika outputnya jelas menunjukkan kedua bilangan bulat.
orlp
1
@ SamYonnou Itu sudah ada, tetapi menyalahgunakan jenis nomor asli untuk meremehkan masalah adalah salah satu celah yang dilarang secara default.
Dennis

Jawaban:

6

M. , 9 byte

RÆN²‘İḤCP

Cobalah online!

Hal sepele

Temui M!

M adalah garpu Jelly, yang ditujukan untuk tantangan matematika. Perbedaan utama antara Jelly dan M adalah bahwa M menggunakan presisi tak terbatas untuk semua perhitungan internal, yang mewakili hasil secara simbolis. Setelah M lebih matang, Jelly akan secara bertahap menjadi lebih multi-guna dan kurang berorientasi pada matematika.

M sangat banyak pekerjaan yang sedang berjalan (penuh bug, dan tidak juga - berbeda dari Jelly sekarang), tetapi bekerja seperti pesona untuk tantangan ini dan saya tidak bisa menahannya.

Bagaimana itu bekerja

RÆN²‘İḤCP  Main link. Argument: n

R          Range; yield [1, ..., n].
 ÆN        Compute the kth primes for each k in that range.
   ²‘      Square and increment each prime p.
     İ     Invert; turn p² + 1 into the fraction 1 / (p² + 1).
      Ḥ    Double; yield 2 / (p² + 1).
       C   Complement; yield 1 - 2 / (p² + 1).
        P  Product; multiply all generated differences.
Dennis
sumber
Apakah ÆNsatu-satunya operator spesifik M? Also Melly
CalculatorFeline
Tak satu pun dari operator ini khusus untuk M. Perbedaannya adalah bahwa M menghitung sebagian, sedangkan Jelly menghitung angka titik mengambang.
Dennis
9

Mathematica, 32 byte

1##&@@(1-2/(Prime@Range@#^2+1))&

Fungsi tanpa nama yang mengambil input integer dan mengembalikan pecahan sebenarnya.

Ini menggunakan fakta bahwa . Kode ini kemudian di-golf berkat fakta bahwa Mathematica mengaitkan semua aritmatika dasar ke daftar. Jadi pertama-tama kita membuat daftar , lalu mengambil semua bilangan prima dan pasang daftar itu ke dalam ekspresi di atas. Ini memberi kita daftar semua faktor. Akhirnya, kami melipatgandakan semuanya bersama-sama dengan mendaftar ke daftar, yang dapat di-golf-kan(p2-1)/(p2+1) = 1-2/(p2+1){1, 2, ..., n}Times1##& .

Atau, kita dapat menggunakan Arrayuntuk jumlah byte yang sama:

1##&@@(1-2/(Prime~Array~#^2+1))&
Martin Ender
sumber
1-2= 1benar?
CalculatorFeline
@CatsAreFluffy Ya ( -1sebenarnya), tapi 1-2/x ≠ -1/x. ;)
Martin Ender
@Range@±~Array~
CalculatorFeline
6

Python 2, 106 byte

from fractions import*
n=input()
F=k=P=1
while n:b=P%k>0;n-=b;F*=1-Fraction(2*b,k*k+1);P*=k*k;k+=1
print F

Baris pertama dan keempat sangat menyakitkan ... hanya saja ternyata menggunakan Fractionlebih baik daripada mengalikan secara terpisah dan menggunakan gcd, bahkan dengan Python 3.5+ di mana gcdberada math.

Generasi perdana diadaptasi dari jawaban @ xnor di sini , yang menggunakan teorema Wilson.

Sp3000
sumber
5

Ruby, 122 77 65 byte

Terima kasih kepada Sherlock karena telah mengurangi 10 byte.

require'prime'
->n{Prime.take(n).map{|x|1-2r/(x*x+1)}.reduce(:*)}

Menentukan fungsi anonim yang mengambil angka dan mengembalikan a Rational.

sebuah spaghetto
sumber
4

PARI / GP , 33 byte

n->prod(i=1,n,1-2/(prime(i)^2+1))

Versi alternatif (46 byte):

n->t=1;forprime(p=2,prime(n),t*=1-2/(p^2+1));t

Versi yang tidak bersaing memberikan hasil floating-point ( t_REAL) (38 byte):

n->prodeuler(p=2,prime(n),1-2/(p^2+1))
Charles
sumber
4

Jelly , 14 13 byte

RÆN²µ’ż‘Pµ÷g/

Cobalah online! Terima kasih kepada @ Dennis untuk -1 byte.

R                       Range [1..n]
 ÆN                     Nth prime
   ²                    Square
    µ                   Start new monadic chain
     ’ż‘                Turn each p^2 into [p^2-1, p^2+1]
        P               Product
         µ              Start new monadic chain
          ÷             Divide by...
           g/           Reduce GCD
Sp3000
sumber
4

Pyth, 26 25

/RiFN=N*MCm,tdhd^R2.fP_ZQ

Cobalah di sini atau jalankan Test Suite .

1 byte disimpan berkat Jakube!

Implementasi spesifikasi yang cukup naif. Menggunakan spiffy "baru" (Saya tidak tahu kapan ini ditambahkan, tapi saya belum pernah melihatnya sebelumnya) P<neg>yang mengembalikan apakah nilai positif dari angka negatif adalah prima atau tidak. Beberapa pemetaan, dll mungkin bisa di-golf ...

FryAmTheEggman
sumber
3

Julia, 59 42 byte

n->prod(1-big(2).//-~primes(2n^2)[1:n].^2)

Ini adalah fungsi anonim yang menerima bilangan bulat dan mengembalikan Rationaldengan BigIntpembilang dan penyebut.

Kita mulai dengan membuat daftar bilangan prima kurang dari 2 n 2 dan memilih elemen n pertama . Ini bekerja karena n th prime selalu kurang dari n 2 untuk semua n > 1. ( Lihat di sini .)

Untuk setiap p dari n bilangan prima yang dipilih, kita kuadratkan p menggunakan kekuatan elementwise ( .^2), dan membangun rasional 2 / ( p + 1), di mana 2 pertama dikonversi menjadiBigInt untuk memastikan presisi yang cukup. Kami kurangi ini dari 1, ambil produk dari susunan rasional yang dihasilkan, dan kembalikan rasional yang dihasilkan.

Contoh penggunaan:

julia> f = n->prod(1-big(2).//-~primes(2n^2)[1:n].^2)
(anonymous function)

julia> f(15)
4506715396450638759507001344//11179755611058498955501765625

Disimpan 17 berkat Sp3000!

Alex A.
sumber
2

Cembung, 28 byte

Convex adalah bahasa baru yang saya kembangkan yang sangat didasarkan pada CJam dan Golfscript. Interpreter dan IDE dapat ditemukan di sini . Input adalah bilangan bulat ke argumen baris perintah. Indeks berbasis satu. Menggunakan pengkodean CP-1252.

,:)_{µ²1-}%×\{µ²1+}%׶_:Ðf/p

Anda mungkin atau mungkin tidak menganggap jawaban ini bersaing karena saya sedang mengerjakan beberapa fitur yang digunakan program ini sebelum tantangan diposting, tetapi komit dibuat setelah saya melihat tantangan ini keluar.

GamrCorps
sumber
2

MATL , 18 byte

:Yq2^tqpwQpZd1Mhw/

Cobalah online!

Gagal untuk input besar karena hanya bilangan bulat hingga 2^52dapat diwakili secara akurat secara internal.

Penjelasan

:     % implicitly take input n. Generate range [1,...,n]
Yq    % first n prime numbers
2^    % square
tqp   % duplicate. Subtract 1. Product
wQp   % swap. Add 1. Product
Zd    % gcd of both products
1M    % push the two products again
h     % concatenate horizontally
w/    % swap. Divide by previously computed gcd. Implicitly display
Luis Mendo
sumber
2

Mathematica, 45 byte

Times@@Array[(Prime@#^2-1)/(Prime@#^2+1)&,#]&

Bilangan prima? Pecahan? Mathematica.

CalculatorFeline
sumber
1

Haskell, 53 byte

Fungsi anonim, 53 karakter:

(scanl(*)1[1-2%(p*p+1)|p<-nubBy(((>1).).gcd)[2..]]!!)

Coba di sini (catatan: di GHCi standar, Anda harus terlebih dahulu memastikan Data.Ratiodan Data.Listdiimpor):

λ (scanl(*)1[1-2%(p*p+1)|p<-nubBy(((>1).).gcd)[2..]]!!) 5
41472 % 99125
:: Integral a => Ratio a

Pengindeksan daftar Haskell !!berbasis 0. (___!!)adalah bagian operator , membentuk fungsi anonim sehingga(xs !!) n == xs !! n .

Ini kurang empat byte untuk menghasilkan seluruh urutan:

λ mapM_ print $ take 10 $     -- just for a nicer output
    scanl(*)1[1-2%(n*n+1)|n<-[2..],all((>0).rem n)[2..n-1]]
1 % 1
3 % 5
12 % 25
144 % 325
3456 % 8125
41472 % 99125
3483648 % 8425625
501645312 % 1221715625
18059231232 % 44226105625
4767637045248 % 11719917990625
:: IO ()
Will Ness
sumber
0

Serius, 25 byte

,r`PªD;⌐k`M┬`π`Mi│g;)@\)\

Output a\nb( \nadalah baris baru). Input besar akan memakan waktu lama (dan mungkin gagal karena kehabisan memori) karena generasi utama sangat lambat.

Cobalah online!

Penjelasan:

,r`PªD;⌐k`M┬`π`Mi│g;)@\)\
,r                         push range(input)
  `PªD;⌐k`M                map:
   P                         k'th prime
    ª                        square
     D                       decrement
      ;                      dupe
       ⌐                     add 2 (results in P_k + 1)
        k                    push to list
           ┬               transpose
            `π`M           map product
                i│         flatten, duplicate stack
                  g;)      push two copies of gcd, move one to bottom of stack
                     @\    reduce denominator
                       )\  reduce numerator
Mego
sumber
Judulnya terlihat lucu. Saya membacanya sebagai "Serius, 25 byte?!"
cdt
@AlexKChen Sudah hampir 2 tahun sejak saya membuat bahasa, dan sekarang baru saja terbayar :)
Mego