วิธีเขียนตัวเลขเป็นผลบวกของสี่เหลี่ยมมีกี่วิธี


12

งาน

กำหนดจำนวนเต็มสองจำนวนdและnหาจำนวนวิธีที่จะแสดงnเป็นผลรวมของdกำลังสอง นั่นคือn == r_1 ^2 + r_2 ^2 + ... + r_d ^2เช่นว่าเป็นจำนวนเต็มสำหรับจำนวนเต็มทั้งหมดr_m 1 ≤ m ≤ dโปรดทราบว่าการแลกเปลี่ยนสองค่าที่แตกต่างกัน (เช่นr_1และr_2) นั้นถือว่าแตกต่างจากโซลูชันดั้งเดิม

ตัวอย่างเช่นหมายเลข 45 สามารถเขียนเป็นผลรวมของ 2 กำลังสอง 8 วิธีที่แตกต่าง:

45
== (-6)^2 + (-3)^2
== (-6)^2 + 3^2
== (-3)^2 + (-6)^2
== (-3)^2 + 6^2
== 3^2 + (-6)^2
== 3^2 + 6^2
== 6^2 + (-3)^2
== 6^2 + 3^2

กฎระเบียบ

  • อนุญาตให้ใช้โซลูชันในตัว แต่ไม่สามารถแข่งขันได้ (ahem, Mathematica )
  • ช่องโหว่มาตรฐานยังเป็นสิ่งต้องห้าม
  • อินพุตอาจกลับด้าน

ตัวอย่าง I / O

In:   d, n

In:   1, 0
Out:  1

In:   1, 2
Out:  0

In:   2, 2
Out:  4

In:   2, 45
Out:  8

In:   3, 17
Out:  48

In:   4, 1000
Out:  3744

In:   5, 404
Out:  71440

In:   11, 20
Out:  7217144

In:   22, 333
Out:  1357996551483704981475000

นี่คือดังนั้นการส่งที่ใช้ไบต์น้อยที่สุดจะชนะ!


เหตุใดคุณจึงลบสิ่งนี้และโพสต์ใหม่ในขณะที่คุณสามารถแก้ไขโพสต์ที่คุณลบได้
Leun Nun

@LeakyNun เบราว์เซอร์ของฉันมีข้อผิดพลาดเกิดขึ้นเมื่อฉันพยายามแก้ไขก่อนที่จะลบ
JungHwan Min


1
ไม่ n คือ 0 ไม่ใช่ d
Leun Nun

1
@DeadPossum สำหรับ1, 0กรณีทดสอบมี1วิธีการแสดง0เป็นผลรวมของตาราง:1 0 == 0^2
JungHwan Min

คำตอบ:



5

Mathematica ขนาด 8 ไบต์ไม่มีการแข่งขัน

SquaresR

3
แบบนี้ก็จำเป็น ... ไม่เพิ่มอะไรใหม่ให้กับคำถาม : P
Erik the Outgolfer

@EriktheOutgolfer ตำหนิคำถาม; มันระบุอย่างชัดเจนว่าได้รับอนุญาต
JollyJoker

ช่วงเวลาเหล่านั้นที่โซลูชันที่ไม่ใช่ในตัวเกือบจะเอาชนะโซลูชันในตัว: D
David Mulder

@ JollyJoker ประเด็นของฉันคือคำตอบควรเพิ่มบางสิ่งลงในคำถามมิฉะนั้นทำไมถึงต้องโพสต์ *
shrug

@DavidMulder ฉันในตอนแรกพลาด "เกือบ" และตกใจเล็กน้อย ...
Erik the Outgolfer


4

MATL , 13 ไบต์

y_t_&:Z^U!s=s

ปัจจัยการผลิตที่มีแล้วn dกรณีทดสอบบางหน่วยความจำไม่เพียงพอ

ลองออนไลน์!

คำอธิบาย

พิจารณาอินพุต17, 3.

y     % Implicit inputs. Duplicate from below
      % STACK: 17, 3, 17
_     % Negate
      % STACK: 17, 3, -17
t_    % Duplicate. Negate
      % STACK: 17, 3, -17, 17
&:    % Two-input range
      % STACK: 17, 3, [-17 -16 ... 17]
Z^    % Cartesian power. Gives a matrix where each Cartesian tuple is a row
      % STACK: 17, [-17 -17 -17; -17 -17 -16; ...; 17 17 17]
U     % Square, element-wise
      % STACK: 17, [289 289 289; 289 289 256; ...; 289 289 289]
!s    % Transpose. Sum of each column
      % STACK: 17, [867 834 ... 867]
=     % Equals?, element-wise
      % STACK: 17, [0 0 ... 0] (there are 48 entries equal to 1 in between)
s     % Sum. Implicit display
      % STACK: 48

3

Haskell , 43 ไบต์

0#0=1
d#n=sum[(d-1)#(n-k*k)|d>0,k<-[-n..n]]

เพียงแค่เรียกซ้ำขั้นพื้นฐานของคุณ #กำหนดฟังก์ชันการมัดไบนารี ลองออนไลน์!

คำอธิบาย

0#0=1            -- If n == d == 0, give 1.
d#n=             -- Otherwise,
 sum[            -- give the sum of
  (d-1)#(n-k*k)  -- these numbers
  |d>0,          -- where d is positive
   k<-[-n..n]]   -- and k is between -n and n.

ถ้าd == 0และn /= 0เราอยู่ในกรณีที่สองและเงื่อนไขd>0ทำให้รายการว่างเปล่า ผลรวมของรายการว่างคือ 0 ซึ่งเป็นผลลัพธ์ที่ถูกต้องในกรณีนี้



2

05AB1E , 10 ไบต์

Ð(Ÿ²ã€nOQO

รับอาร์กิวเมนต์เป็น n จากนั้น d มีปัญหาในการแก้กรณีทดสอบที่ใหญ่กว่า

ลองออนไลน์!

คำอธิบาย

Ð(Ÿ²ã€nOQO   Arguments n, d
Ð            Triplicate n on stack
 (           Negate n
  Ÿ          Range: [-n ... n]
   ²ã        Caertesian product of length d
     €n      Square each number
       OQ    Sum of pair equals n
         O   Total sum (number of ones)


2

Mathematica, 38 ไบต์

Count[Tr/@Tuples[Range[-#,#]^2,#2],#]&

ฟังก์ชั่นบริสุทธิ์ที่รับอินพุตตามลำดับn, d. Range[-#,#]^2ให้ชุดของสี่เหลี่ยมที่เกี่ยวข้องทั้งหมดที่อาจเป็นไปได้ด้วยกำลังสองบวกที่ระบุไว้สองครั้งเพื่อให้การนับถูกต้อง Tuples[...,#2]สร้างd-tuples ของกำลังสอง Tr/@ผลรวมแต่ละdtuple; และนับว่าหลายผลเท่ากับCount[...,#]n

ครั้งแรกกรณีทดสอบไม่กี่ยุติได้อย่างรวดเร็ว 1000,4แต่ผมประเมินนี้จะใช้เวลาประมาณครึ่งปีในการทำงานในกรณีทดสอบ แทนที่Range[-#,#]ด้วยRange[-Floor@Sqrt@#,Floor@Sqrt@#]ความเร็วที่เหมาะสม แต่นานกว่านั้นการคำนวณเป็นประมาณ 13 วินาที



1

Python 2, 138

ทางออกที่ไม่มีประสิทธิภาพมากกับ eval ที่รักของฉัน ทำไมจะไม่ล่ะ?
ลองออนไลน์

lambda n,d:d and 4*eval(eval("('len({('+'i%s,'*d+'0)'+'for i%s in range(n)'*d+'if '+'i%s**2+'*d+'0==n})')%"+`tuple(range(d)*3)`),locals())

มันสร้างและประเมินรหัสเช่นนี้:

len({(i0,i1,0)for i0 in range(n)for i1 in range(n)if i0**2+i1**2+0==n})

ดังนั้นสำหรับบางdใหญ่มันจะทำงานนานมากและใช้หน่วยความจำจำนวนมากมีความซับซ้อนของ O (n ^ d)



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.