数を二乗和として書く方法はいくつありますか?


12

仕事

2つの整数dとが与えられた場合、平方和としてn表現する方法の数を見つけます。つまり、そのようなことは、すべての整数の整数です。2つの異なる値(たとえばと)を交換することは、元のソリューションとは異なると見なされることに注意してください。ndn == r_1 ^2 + r_2 ^2 + ... + r_d ^2r_m1 ≤ m ≤ dr_1r_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

これはであるため、最小バイト数を使用した送信が勝ちです!


削除した投稿を編集できるのに、なぜこれを削除して新しい投稿を投稿したのですか?
リーキー修道女

@LeakyNun削除する前であっても、編集しようとするとブラウザがエラーを投げました。
ジョンファンミン


1
いいえ、nは0であり、dではありません。
リーキー修道女

1
@DeadPossum 1, 0テストケースの場合、平方和として1表現する方法があります。010 == 0^2
ジョンファンミン

回答:



5

Mathematica、8バイト、非競合

SquaresR

3
このようにさえ必要でした...質問に新しいものを追加しません。:P
エリック・ザ・アウトゴルファー

@EriktheOutgolfer質問のせいだ。明示的に許可されていると述べています。
ジョリージョーカー

非組み込みソリューションが組み込みソリューションをほとんど打ち負かした瞬間:D
デビッドモルダー

@JollyJoker私のポイントは、答えが質問に何かを追加する必要があるということです。*肩をすくめる*:P
エリックアウトゴルファー

私が最初に逃した@DavidMulder「ほぼ」と...少しショックを与えた
エリックOutgolfer


4

MATL、13バイト

y_t_&:Z^U!s=s

入力はn、その後、d。一部のテストケースではメモリが不足しています。

オンラインでお試しください!

説明

入力を考えてみましょう173

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 == 0n /= 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],#]&

入力を順番に取る純粋な関数ndRange[-#,#]^2関連する可能性のあるすべての正方形のセットを提供し、正の正方形を2回リストして、カウントを正しくします。そのような正方形の-タプルをTuples[...,#2]生成しdます。Tr/@dタプルを合計します。Count[...,#]結果のどれだけが等しいかを数えますn

最初のいくつかのテストケースはすぐに終了しますが、テストケースで実行するには約半年かかると推定しています1000,4Range[-#,#](より長いが)より賢明な方法Range[-Floor@Sqrt@#,Floor@Sqrt@#]で置き換えると、その計算は約13秒に短縮されます。



1

Python 2、138

私の最愛の評価と非常に非効率的なソリューション。何故なの?
オンラインで試す

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.