Teorema de Ryley

13

S. Ryley provou o seguinte teorema em 1825:

Todo número racional pode ser expresso como uma soma de três cubos racionais.

Desafio

Dado algum número racional encontre três números racionais tal modo querQuma,b,cQ

r=uma3+b3+c3.

Detalhes

Seu envio deve ser capaz de calcular uma solução para cada entrada com tempo e memória suficientes, o que significa que, por exemplo, dois de 32 bits intrepresentando uma fração não é suficiente.

Exemplos

30=39829338766813-6366005495153-3977505554546352=607029013173+239612924543-6192271286533071728=(12)3+(13)3+(14)30 0=0 03+0 03+0 031=(12)3+(23)3+(56)342.=(1810423509232)3+(-1495210609)3+(-25454944)3

flawr
fonte
1
Eu tinha algo que meio que funcionava no Japt, mas muitas vezes ocorria um erro de "muita recursão". Provavelmente porque a estratégia era "obter números aleatórios, tente novamente até que sejam uma resposta correta".
Kamil Drakari 04/11
1
Exigindo apoio bignum exclui desnecessariamente um monte de línguas, e / ou requer muito clichê desperdiçado para implementá-las
Sparr
2
@Sparr Esta foi uma escolha deliberada, pois a saída pode ser bastante "grande", mesmo para entradas simples, ou dependendo do método usado, os valores intermediários no cálculo também podem ser muito grandes. Portanto, trabalhar com números de precisão arbitrários foi um ponto importante para esse desafio (e provavelmente com bastante frequência em outros desafios da teoria dos números).
flawr
1
Seria aceitável enviar [p1,p2,p3,q], interpretado como ? (p1q)3+(p2q)3+(p3q)3
Arnauld #
Na mesma linha, os três números racionais produzidos devem estar na forma mais simples?
Quintec 4/11

Respostas:

10

Pari / GP , 40 bytes

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

Experimente online!


O mesmo comprimento, a mesma fórmula:

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

Experimente online!


Esta fórmula é dada em: Richmond, H. (1930). Em soluções racionais de . Anais da Edinburgh Mathematical Society, 2 (2), 92-100.x3+y3+z3=R

r=(27r3+127r2-9r+3)3+(-27r3+9r-127r2-9r+3)3+(-27r2+9r27r2-9r+3)3

Verifique online!

alefalpha
fonte
1
-5 bytes porque você pode alterar a ordem dos summands
Black Owl Kai
1
@BlackOwlKai O numerador do segundo comando é , não . - 27 r 2 + 9 r - 1-27r3+9r-1-27r2+9r-1
Alephalpha #
8

Haskell , 95 89 76 69 68 bytes

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

Experimente online!

Solução bruteforce simples. Ele testa todos os triplos de números racionais do formato

(uma1n,uma2n,uma3n)com -numaEunn.

  • Sempre podemos assumir que os três números racionais têm o mesmo denominador, pois
    (uma1n1,uma2n2,uma3n3)=(uma1n2n3n1n2n3,uma2n1n3n1n2n3,uma3n1n2n1n2n3).
  • Sempre podemos assumir que , pois para qualquer número inteiro arbitrariamente grande .-numaEunn
    umaEun=umaEuNnN
    N
Delfad0r
fonte
O que o "IOU" faz?
Solomon Ucko
@SolomonUcko Nada de especial, é tão bom quanto qualquer outra lista de comprimento 3 #
Delfad0r
@ H.PWiz Não consegui encontrar nenhum consenso sobre o Meta sobre se a entrada digitada é aceita, mas ainda assim encontrei uma maneira de encurtar o código sem essa suposição. Obrigado!
Delfad0r 3/11
4
@ Delfad0r Existe um "consenso" de que você não precisa contar uma possível importação, que é necessária apenas para construir o tipo necessário, se você não precisar explicitamente de nada dessa importação para definir sua função. (E você pode assumir que o tipo correto é passado para a função, quando é chamado.)
flawr
1
Salvar um byte usando[-n,1/n-n..n]
Christian Sievers
6

Casca , 14 bytes

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

Solução simples de força bruta. Experimente online!

Explicação

A divisão em Husk usa números racionais por padrão e os produtos cartesianos funcionam corretamente para listas infinitas, tornando este um programa muito simples.

ḟ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.
Zgarb
fonte
2

Haskell , 70 bytes

Em uma introdução à Teoria dos Números (de Hardy e Wright), há uma construção que inclui até um parâmetro racional. Para fins de golfe, apenas configurei esse parâmetro como 1 e tentei reduzir o máximo possível. Isso resulta na fórmula

r[r3-648r2+77760r+37324872(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]

Experimente online!

flawr
fonte
1

perl -Mbigrat -nE, 85 bytes

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

Você pode salvar 8 bytes (o primeiro $_=eval;) se souber que a entrada é um número inteiro; esta parte é necessária para que o programa grok uma entrada do formulário 308/1728. A entrada é lida em STDIN. Estou usando a fórmula dada por @alephalpha.


fonte