Hardy sâu Ramanujan tổng quát hóa số


12

1729, được gọi là số Ramanujan Hardy , là số nguyên dương nhỏ nhất có thể được biểu thị dưới dạng tổng của hai khối số nguyên dương theo hai cách ( 12^3+1^3=10^3+9^3=1729). Cho một số nguyên n(như đầu vào dưới bất kỳ hình thức nào là tự nhiên đối với ngôn ngữ bạn chọn), tìm số nguyên dương nhỏ nhất có thể được biểu thị dưới dạng tổng của hai số nguyên dương được nâng lên nlũy thừa theo hai cách duy nhất. Không sử dụng các nguồn bên ngoài. Ít nhân vật nhất chiến thắng.

Lưu ý rằng đây thực sự là một vấn đề chưa được giải quyết cho n>4. Đối với những con số đó, hãy để chương trình của bạn chạy mãi trong tìm kiếm, hoặc chết vì cố gắng! Làm cho nó để nếu có thời gian và nguồn lực vô hạn, chương trình sẽ giải quyết vấn đề.


2
Bạn có thể (?) Muốn chỉ định "tổng của hai số nguyên dương được nâng lên nlũy thừa". Mặt khác, 91(không 1729) là giải pháp cho n=3, vì 6^3+(−5)^3=4^3+3^3=91. Tôi đã học được điều này từ liên kết Wikipedia của bạn để có thể tham chiếu HM ​​của bạn làm cho điều này không cần thiết theo quy ước. Chúc mừng!
Darren Stone

thực ra, 1là giải pháp đầu tiên:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak

Cảm ơn các đề xuất và chỉnh sửa - Tôi có nghĩa là 2 số nguyên tích cực!
Ben Reich

1
@JanDvorak, ha, vâng. Giữ nó R eal!
Darren Stone

Bạn nói " tìm các số nguyên dương nhỏ nhất mà" ..., như thể có một - nhưng đối với bất kỳ n > 4, sự tồn tại của số đó là một vấn đề chưa được giải quyết . Có lẽ bạn nên nói "tìm số nguyên dương nhỏ nhất ( nếu có )" ... Có thể "câu trả lời" là các vòng lặp không tìm thấy mà không tìm thấy gì.
res

Câu trả lời:


3

APL  45  41

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1}

Phiên bản ngắn hơn nhưng chậm hơn của 41 ký tự:

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⍺:⍺⋄⍵∇⍨⍺+1}

Bạn có thể thử trực tuyến , chỉ cần dán chức năng và gọi nó với một số:

      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
50
      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 3
1729

(Tuy nhiên, thuật toán khá ngu ngốc, đừng hy vọng trình thông dịch trực tuyến sẽ tính n = 4)

Câu trả lời cho n = 2 là 50 = 5² + 5² = 7² + 1² vì đó là một số "có thể được biểu thị dưới dạng tổng của hai bình phương của số nguyên dương mà không nói khác nhau theo hai cách."

Nếu bạn muốn thêm mệnh đề riêng biệt, chỉ cần thay đổi (v∘.≤v)thành (v∘.<v), cùng số ký tự và n = 2 trở thành 65:

      {⍺←1⋄2≤+/,⍺=(v∘.<v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
65

Tôi đang đánh GolfScript? Không thể nào !!


đẹp! Và tôi đã có nghĩa là số nguyên khác biệt, nhưng tôi đã không chỉ định, vì vậy nhiều sức mạnh hơn cho bạn! Quay lại bảng vẽ cho GolfScript ...
Ben Reich

2

Hồng ngọc, 132

n=$*[r=0].to_i;while r+=1
r.times{|a|r.times{|b|next if
a**n+b**n!=r;r.times{|c|r.times{|d|puts(r)if
c**n+d**n==r&&a!=c&&a!=d}}}}end

Truyền ndưới dạng đối số dòng lệnh. Dòng đầu tiên stdoutlà giải pháp.

Tối ưu hóa cho mã golf, không hiệu suất. (Chạy chính xác. Nhưng chậm. Có nhiều công việc hơn mức cần thiết.)


Đây là một chương trình C dài hơn, nhanh hơn một chút. Cùng một thuật toán đúng nhưng khủng khiếp. (Tôi thực sự cần nghiên cứu thêm lý thuyết!)

Đã kiểm tra n= 2, n= 3.

C, 234

#include<stdio.h>#include<math.h>
r,a,b,c,d;main(n){scanf("%d",&n);while(++r){for(a=0;a<r;++a){for(b=a;b<r;++b){if(pow(a,n)+pow(b,n)!=r)continue;for(c=a+1;c<r;++c){for(d=0;d<r;++d){if(pow(c,n)+pow(d,n)==r&&a!=d)printf("%d\n",r);}}}}}}

Phiên bản C diễn nra stdin. Như trên, dòng đầu tiên stdoutlà giải pháp.


1

GolfScript 53

1\.{;\).,{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

Đầu vào là số ban đầu trên ngăn xếp. Số ở trên cùng của ngăn xếp ở cuối là câu trả lời. Tôi sẽ giải thích điều này chi tiết hơn khi tôi có cơ hội.

Ví dụ

{1\.{;\).,@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)}:f
2 f -> 25 
3 f -> 1729

Điều này là khá chậm ngay bây giờ. Nó cũng được tính 0(vì vậy 25 là câu trả lời cho n=2, kể từ đó 25=5^2+0^2=3^2+4^2. Để không tính 0, hãy thêm 2 ký tự (;vào sau ký tự đầu tiên,

1\.{;\).,(;{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

Để tìm thấy điều đó 2 f=65, kể từ khi65=8^2+1^2=5^2+6^2


1

GolfScript (30 ký tự)

:N{).,{)N?}%:P{1$\-P?)},,3<}do

Lưu ý: điều này khá chậm, bởi vì nó thực hiện tìm kiếm vũ phu hơn là thứ gì đó tao nhã như hàng đợi ưu tiên. Điều thanh lịch nhất về nó là tái sử dụng Nnhư một giới hạn thấp hơn để tìm kiếm: điều này là hợp lệ bởi vì 1^N + 2^N > Ntất cả N.

Lấy Ntrên ngăn xếp, để lại số taxi tương ứng trên ngăn xếp. Để lấy Ntừ stdin, hãy chuẩn bị trước ~.

Phiên bản trên cho phép x^N + x^N(vì vậy N=2nó cho 50). Để yêu cầu thêm các số riêng biệt ( 65thay vào đó), thay đổi 3thành 4. Để cho phép 0^N + x^N(cho 25), loại bỏ )ngay trước đó N?.


0

Toán học, 58 ký tự

Một giải pháp rất rất chậm sử dụng chức năng tạo:

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.