誤解された単項式


9

正であるnと仮定して、方程式が存在しx

方程式

これは、2つの単項式の間の関係を表します。多くの人々は、これらを同一視するという単純な間違いを犯します(つまり3x^2、および(3x)^2)。

チャレンジ

正の整数を指定iすると、解nを決定して返し、x合計が最小になるように配列として返し[n, x]ます。引き分けの場合は、どのソリューションセットでも問題ありません。

テストケース

62658722541234765
[15, 11]

202500
[4, 15]

524288
[8, 4]

33044255768277
[13, 9]

[x, n]代わりに戻ることはできます[n, x]か?
16

また、時間的な制約はありますか?
16

nx整数、そうですか?
Luis Mendo 2016

出力はフォーム[n, x]であり、時間の制約はありません@Fatalize
Zach Gates

はい、nそしてx整数です@LuisMendo
Zach Gates

回答:


5

Brachylog、35バイト

,[N:X]#>>==L(.rMtT;Lr.rMtT),M^:T*?,

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

説明

リストを作成します[N, X]。ここでN >= X、値を割り当てた後、両方[N, X][X, N]可能な限りの出力を試みます。たとえば、Nに割り当てられます3、我々はバックトラックによってテストされます[3, 1][1, 3][3, 2][2, 3][3, 3][3, 3]。その後、次のバックトラックステップがの値で発生し、Nに移動します4

,[N:X]     The list [N, X]
#>         Both N and X are strictly positive
>=         N >= X
=L         Assign values to N and X, and L = [N, X]
(          Either...
    .          Output = L
    rM         M is the reverse of the Output
    tT         T is the second element of M
;          ...or...
    Lr.        Output is the reverse of L
    rM         M = L
    tT         T is the last element of M
),
M^         First element of M to the power of the second element of L (T)...
:T*?,      ... times T is equal to the Input

5

Mathematica、61バイト

マイルのおかげで2バイトを節約できたのに加えて、理由もなく数えたバイトの束全体に感謝します。

Last@Select[{n,(#/n)^(1/n)}~Table~{n,2Log@#},IntegerQ@*Last]&

nのすべての可能な値を使用して、ペアの表{n、x}を計算します。ここで、x =(i / n)^(1 / n)です。対応するxが整数であるものだけを保持します。次に、nの最大値を持つペアを返します。

ここで、「nのすべての可能な値」の範囲は1〜2 * ln(i)です。これはソリューション{n、x} = {i、1}を無視しますが、ソリューション{n、x} = {1、i}が最善の選択であれば十分であるので問題ありません。したがって、xが2より小さくなる必要はありません。つまり、n * 2 ^ n≤iであり、そのようなすべてのnは2 * ln(i)未満です。

計算を使用して、このコンテキストで合計を最小化するペア{n、x}が、最大のnを持つペア{n、x}と同じであることを示すことができます({i、1}を数えません)。そのLastため、最適なペアを見つけるにはイニシャルで十分です。


1
IntegerQ@*Last2バイトを節約するためにを使用してテスト条件を構成できますが、この現在のバージョンでは86バイトではなく63バイトもカウントします。
マイル

3

MATL、22バイト

`T@XK:"@K@-@^*G=?3Mb~.

出力はxnこの順序でです。

入力は、MATLのデフォルトのdoubleデータ型によって制限されます。これにより、最大で整数2^53のみを正確に表すことができます。これは最初のテストを除外します(それでも正しい結果が得られますが、一般的に入力が非常に大きい場合は保証されません)。

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

説明

コードは2つのネストされたループを使用します。

  • 外側のdo...whileループは、すべての可能な合計n+xを昇順で通過します。解決策が見つかるとすぐにループが停止します。これにより、最小の合計でソリューションが出力されることが保証されます。
  • 内部for eachループは、すべてnxその合計でテストします。合計が入力と一致すると、内側のループが終了し、外側のループのループ条件がfalse1にも出るように設定されます。

コメント付きコード:

`         % Do...while
  T       %   Push "true". Will be used as loop condition (possibly negated to exit loop)
  @       %   Push iteration index, say K, which represents n+x
  XK      %   Copy that into clipboard K
  :       %   Range [1 2 ... K]
  "       %   For each
    @     %     Push loop variable (1, 2, ... K), which represents n
    K@-   %     Compute x as K minus n
    @     %     Push n again
    ^*    %     Power, multiply. This gives n*x^n
    G=    %     Does this equal the input?
    ?     %     If so
      3M  %       Push the inputs of the third-last function, that is, x and n
      b   %       Bubble up the "true" that is at the bottom of the stack
      ~   %       Transform it into "false". This will exit the do...while loop
      .   %       Break the for loop
          %     Implicitly end if
          %   Implicitly end for
          % Implicitly end do...while
          % Implicitly display

2

ゼリー23 16バイト

×*@¥/=³
ṗ2ÇÐfSÞḢ

与えられた場合i、これはで置換されたすべての整数ペアを生成し[1, i]ます。次に、以下に示す以前のソリューションと同じフィルタリングと並べ替えを実行します。時間の制約がないので、十分な時間をかけて総当たりが機能します。

オンラインでお試しください!ですが、大きな値をオンラインで試さないでください。

私のPCではi = 2048、非効率的なバージョンを使用して結果を計算するのに約6分かかります。

効率的なバージョン

これは、大きな値をすばやく解決できる23バイトの以前のソリューションです。

×*@¥/=³
ÆDµṚ*İ⁸żḞÇÐfSÞḢ

与えられたi、の除数を計算iするペアを生成するために[n, x]どこn除数とですx = floor( (i/n)^(1/n) )。次に、で値をフィルタリングしn * x^n == i、残りのペアを合計でソートして、最初のペアを返します。

オンラインでお試しください!またはすべてのテストケースを確認します。

説明

×*@¥/=³  Helper link. Input: list [n, x]
    /    Reduce using
   ¥       A dyadic chain
 *@        Compute x^n
×          Multiply by n
      ³  The initial value i
     =   Test if n * x^n == i

ṗ2ÇÐfSÞḢ  Main link (16 byte version). Input: integer i
ṗ2        Generate all pairs of integers in [1, i]
  ÇÐf     Filter for where the helper link is true
     SÞ   Sort them by their sum
       Ḣ  Return the first result

ÆDµṚ*İ⁸żḞÇÐfSÞḢ  Main link (23 byte version). Input: integer i
ÆD               Compute the divisors of i
  µ              Begin a new monadic chain operating on the divisors
   Ṛ             Reverse the divisors
     İ           Reciprocal of each divisors
    *            Raise each in the reversed divisors to the reciprocal of a divisor
      ⁸          Get the divisors
       ż         Interleave the divisors with the previous powers
        Ḟ        Floor each
         ÇÐf     Filter for where the helper link is true
            SÞ   Sort them by their sum
              Ḣ  Return the first result

1

PHP、104バイト

for(;1<$x=(($i=$argv[1])/++$n)**(1/$n);)!($x==ceil($x))?:$a[$x+$n]="[$x, $n]";ksort($a);echo$a[key($a)];

これは、提案された形式ではないすべての可能なソリューションを出力します73バイト

for(;1<=$x=(($i=$argv[1])/++$n)**(1/$n);)!($x==ceil($x))?:print"$x,$n\n";

1

Perl、52バイト

+2を含む -ap

STDINに入力する

mono.pl <<< 33044255768277

mono.pl

#!/usr/bin/perl -ap
$_=("@F"/++$.)**(1/$.)while!/\./?$\="$. $_":$_>2}{

それもうまくいくようにいくつかの努力をし1ました。浮動小数点エラーが原因で、一部の入力に対して誤った答えが返されるかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.