Decomposizione razionale a = xyz (x + y + z)


21

Funzioni di scrittura x(a), y(a)e z(a)tale che per ogni razionale a tutte le funzioni restituiscono numeri razionali e x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Puoi assumere un valore ≥ 0.

Non è necessario utilizzare tipi o operazioni razionali nel programma, purché il programma sia matematicamente valido. Ad esempio, se usi una radice quadrata nella tua risposta, devi dimostrare che il suo argomento è sempre un quadrato di un numero razionale.

Puoi scrivere tre funzioni denominate x, y, z o scrivere tre programmi invece se le funzioni sono ingombranti o inesistenti per la tua lingua. In alternativa puoi anche scrivere un singolo programma / funzione che restituisce tre numeri x, y, z. Infine, se preferisci, puoi inserire / emettere i numeri razionali come coppia di numeratori / denominatori. Il tuo punteggio è la dimensione totale delle tre funzioni o tre programmi in byte. Il punteggio più piccolo vince.

La forza bruta non è consentita. Per ogni a = p / q dove p, q ≤ 1000 il programma dovrebbe essere eseguito in meno di 10 secondi.


Un esempio (questo non significa che la tua decomposizione debba fornire questi numeri):

x = 9408/43615
y = 12675/37576
z = 1342/390
x*y*z*(x+y+z) = 1

Possiamo scrivere una funzione che li genera tutti insieme (diciamo, in un array)?
Leaky Nun,

Possiamo inserire il numeratore e il denominatore come due numeri?
Leaky Nun,

@LeakyNun Sì e sì.
orlp,

1
È provabile per nessuno a?
Fatalizza il

2
Suppongo che non vuoi mostrare una prova perché darebbe una soluzione, ma la tua parola non è davvero una prova.
Fatalizza il

Risposte:


10

CJam (59 byte)

{[WZ~C24X8TT]f*[4XGYC6 4Y].+_0=!>2%Z65135Zb+:(3/.f#:.*)W*+}

Questo è un blocco (funzione) anonimo che accetta un numero intero o doppio nello stack e produce un array con tre doppie. Ha due casi internamente per gestire tutti gli input non negativi, poiché con un solo caso si spezzerebbe su uno 0.25o l'altro 4. Si rompe ancora per gli input -12e -1.3333333333333333, ma le specifiche consentono che ...

La demo online la esegue, quindi aggiunge i valori, stampa tutti e quattro e li moltiplica per mostrare che ottiene il valore originale (errore di arrotondamento del modulo).

Sfondo matematico

w=-X-y-zX+y+z+w=0-Xyzw=un'Xyzw+un'=0

Elkies offre quattro famiglie di soluzioni. Eulero:

X=6un'St3(un't4-2S4)2(4un't4+S4)(2un'2t8+10un'S4t4-S8)y=3S5(4un't4+S4)22t(un't4-2S4)(2un'2t8+10un'S4t4-S8)z=2(2un'2t8+10un'S4t4-S8)3S3t(4un't4+S4)w=-(2un'2t8+10un'S4t4-S8)6S3t(un't4-2S4)

Uno relativo a Eulero:

X=(8S8+un'2)(8S8-88un'S4-un'2)12S3(S4-un')(8S8+20un'S4-un'2)y=(8S8+un'2)(8S8-88un'S4-un'2)12S3(8S4+un')(8S8+20un'S4-un'2)z=192un'S5(S4-un')2(8S4+un')2(8S8+un'2)(8S8-88un'S4-un'2)(8S8+20un'S4-un'2)w=-3S(8S8+20un'S4-un'2)34(S4-un')(8S4+un')(8S8+un'2)(8S8-88un'S4-un'2)

Uno più semplice:

X=(S4-4un')22S3(S4+12un')y=2un'(3S4+4un')2S3(S4-4un')(S4+12un')z=S5+12un'S2(3S4+4un')w=-2S5(S4+12un')(S4-4un')(3S4+4un')

E uno relativo a quello:

X=S5(S4-3un')32(S4+un')(S12+12un'S8-3un'2S4+2un'3)y=S12+12un'S8-3un'2S4+2un'32S3(S4-3un')(3S4-un')z=2un'(S4+un')2(3S4-un')2S3(S4-3un')(S12+12un'S8-3un'2S4+2un'3)w=-2S(S12+12un'S8-3un'2S4+2un'3)(S4-3un')(S4+un')(3S4-un')

pS4-qun'pqun'un'S=1S=2


1

Assioma, 191 byte

f(s,a)==(b:=s^4-4*a;c:=s^4+12*a;x:=3*s^4+4*a;[b^2/(2*c*s^3),2*a*x^2/(b*c*s^3),s*c/(2*x)])
g(a:FRAC INT):List FRAC INT==(s:=1;repeat(s^4=4*a or s^4=-12*a or 3*s^4=4*a=>(s:=s+1);break);f(s,a))

È la traduzione della formula riportata da Peter Taylor in questa pagina con un po 'di codice che farebbe sì che i denominatori non fossero 0. un test

(7) -> y:=g(1)
          9   98 13
   (7)  [--,- --,--]
         26   39 14
                                              Type: List Fraction Integer
(8) -> y.1*y.2*y.3*(y.1+y.2+y.3)
   (8)  1
                                              Type: Fraction Integer
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.