Teorema di Ryley


13

S. Ryley dimostrò secondo il teorema nel 1825:

Ogni numero razionale può essere espresso come una somma di tre cubi razionali.

Sfida

Dato un numero razionale trova tre numeri razionali tali cherQa,b,cQ

r=a3+b3+c3.

Dettagli

Il tuo invio dovrebbe essere in grado di calcolare una soluzione per ogni input dato tempo e memoria sufficienti, ciò significa che avere ad esempio due 32 bit che intrappresentano una frazione non è sufficiente.

Esempi

30=3982933876681363660054951533977505554546352=607029013173+2396129245436192271286533071728=(12)3+(13)3+(14)30=03+03+031=(12)3+(23)3+(56)342=(1810423509232)3+(1495210609)3+(25454944)3


1
Ho avuto qualcosa che ha funzionato in Japt, ma spesso si è verificato un errore "troppa ricorsione". Probabilmente perché la strategia era "ottieni numeri casuali, riprova finché non sono una risposta corretta".
Kamil Drakari,

1
Richiedere il supporto di bignum esclude inutilmente molte lingue e / o richiede un sacco di scaldavivande sprecate per implementarle
Sparr

2
@Sparr Questa è stata una scelta deliberata, in quanto l'output potrebbe essere piuttosto "grande" anche per input semplici o, a seconda del metodo utilizzato, anche i valori intermedi nel calcolo potrebbero essere molto grandi. Quindi lavorare con numeri di precisione arbitrari è stato un punto importante per questa sfida (e probabilmente abbastanza spesso anche in altre sfide di teoria dei numeri).
Flawr

1
Sarebbe accettabile l'output [p1,p2,p3,q], interpretato come ? (p1q)3+(p2q)3+(p3q)3
Arnauld,

Sulla stessa linea, i tre numeri razionali emessi devono essere nella forma più semplice?
Quintec,

Risposte:


10

Pari / GP , 40 byte

r->[x=27*r^3+1,9*r-x,z=9*r-27*r^2]/(3-z)

Provalo online!


La stessa lunghezza, la stessa formula:

r->d=9*r^2-3*r+1;[x=r+1/3,3*r/d-x,1/d-1]

Provalo online!


Questa formula è data in: Richmond, H. (1930). Sulle soluzioni razionali di . Atti della Edinburgh Mathematical Society, 2 (2), 92-100.x3+y3+z3=R

r=(27r3+127r29r+3)3+(27r3+9r127r29r+3)3+(27r2+9r27r29r+3)3

Controllalo online!


1
-5 byte perché è possibile modificare l'ordine dei riepiloghi
Black Owl Kai

1
@BlackOwlKai Il numeratore del secondo summand è , non - 27 r 2 + 9 r - 1 . 27r3+9r127r2+9r1
alephalpha

8

Haskell , 95 89 76 69 68 byte

f x=[w|n<-[1..],w<-mapM(\_->[-n,1/n-n..n])"IOU",x==sum((^3)<$>w)]!!0

Provalo online!

Semplice soluzione bruteforce. Mette alla prova tutte le triple di numeri razionali della forma

(a1n,a2n,a3n)with nainn.

  • Possiamo sempre presumere che i tre numeri razionali abbiano lo stesso denominatore, poiché
    (a1n1,a2n2,a3n3)=(a1n2n3n1n2n3,a2n1n3n1n2n3,a3n1n2n1n2n3).
  • Possiamo sempre presumere che nainn, poiché
    ain=aiNnN
    per qualsiasi arbitrariamente grande numero interoN.

Cosa fa "IOU"?
Solomon Ucko,

@SolomonUcko Niente di speciale, è bello come qualsiasi altro elenco di lunghezza 3
Delfad0r

@ H.PWiz Non sono riuscito a trovare alcun consenso su Meta sull'ipotesi di accettare input digitati, ma ho comunque trovato un modo per abbreviare il codice senza tale presupposto. Grazie!
Delfad0r

4
@ Delfad0r Esiste un "consenso" sul fatto che non è necessario contare una possibile importazione, necessaria solo per costruire il tipo necessario, se non è necessario esplicitamente nulla da tale importazione per definire la propria funzione. (E puoi presumere che il tipo corretto sia passato alla tua funzione, quando viene chiamato.)
flawr

1
Salvare un byte utilizzando[-n,1/n-n..n]
Christian Sievers il

6

Buccia , 14 byte

ḟo=⁰ṁ^3π3×/NİZ

Semplice soluzione di forza bruta. Provalo online!

Spiegazione

La divisione in Husk utilizza numeri razionali per impostazione predefinita e i prodotti cartesiani funzionano correttamente per elenchi infiniti, rendendo questo un programma molto semplice.

ḟo=⁰ṁ^3π3×/NİZ
            İZ  Integers: [0,1,-1,2,-2,3,-3...
           N    Natural numbers: [1,2,3,4,5...
         ×/     Mix by division: [0,1,0,-1,1/2,0,2,-1/2,1/3...
                This list contains n/m for every integer n and natural m.
       π3       All triples: [[0,0,0],[0,0,1],[1,0,0]...
ḟ               Find the first one
    ṁ^3         whose sum of cubes
 o=⁰            equals the input.


2

Haskell , 70 byte

In Un'introduzione alla teoria dei numeri (di Hardy e Wright) c'è una costruzione che include anche un parametro razionale. Ai fini del golf ho appena impostato questo parametro su 1 e ho provato a ridurre il più possibile. Questo risulta nella formula

r[r3-648r2+77760r+373.24872(r+72)2,12(r-72)r(r+72)2,-r2-720r+518472(r+72)]

f r|t<-r/72,c<-t+1,v<-24*t/c^3,a<-(v*t-1)*c=((a+v*c+c)/2-)<$>[a,v*c,c]

Provalo online!


1

perl -Mbigrat -nE, 85 byte

$_=eval;($a,$b)=($_*9,$_**2*27);$c=$b*$_;say for map$_/($b-$a+3),$c+1,-$c+$a-1,-$b+$a

Puoi salvare 8 byte (il principale $_=eval;) se sai che l'input è un numero intero; questa parte è necessaria per consentire al programma Grok di inserire un modulo 308/1728. L'ingresso viene letto da STDIN. Sto usando la formula data da @alephalpha.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.