Monomial yang disalahartikan


9

Ada persamaan, dengan asumsi ndan xpositif,

persamaan

yang mengekspresikan hubungan antara dua monomial, yang satu merupakan penyajian yang keliru dari yang lainnya. Banyak orang membuat kesalahan sederhana dengan menyamakan ini (yaitu 3x^2dan (3x)^2).

Tantangan

Diberikan bilangan bulat positif i,, tentukan dan kembalikan solusi ndan xdengan jumlah terkecil sebagai array [n, x]. Dalam kasus seri, set solusi apa pun dapat diterima.

Uji Kasus

62658722541234765
[15, 11]

202500
[4, 15]

524288
[8, 4]

33044255768277
[13, 9]

Bisakah kita kembali [x, n]bukan [n, x]?
Fatalkan

Juga, apakah ada batasan waktu?
Fatalkan

ndan xbilangan bulat, kan?
Luis Mendo

Output dalam bentuk [n, x]dan tidak ada batasan waktu @Fatalize
Zach Gates

Ya, ndan xadalah bilangan bulat @LuisMendo
Zach Gates

Jawaban:


5

Brachylog , 35 byte

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

Cobalah online!

Penjelasan

Kami membuat daftar [N, X], di mana N >= X, kemudian setelah menetapkan nilai untuk itu, kami mencoba keduanya [N, X]dan [X, N]mungkin output. Sebagai contoh, jika Nakan ditugaskan untuk 3, kita akan menguji melalui backtracking [3, 1], [1, 3], [3, 2], [2, 3], [3, 3]dan [3, 3]. Setelah itu langkah mundur berikutnya akan terjadi pada nilai N, yang akan pergi ke 4, dll.

,[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 byte

Berkat miles untuk menghemat 2 byte, ditambah sejumlah byte yang saya hitung tanpa alasan!

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

Menghitung tabel pasangan {n, x}, di mana x = (i / n) ^ (1 / n), menggunakan semua nilai n yang mungkin; hanya menyimpan yang x terkait adalah bilangan bulat; lalu kembalikan pasangan dengan nilai n terbesar.

Di sini, "semua nilai yang mungkin dari n" berkisar dari 1 hingga 2 * ln (i). Ini mengabaikan solusi {n, x} = {i, 1}, tetapi tidak apa-apa karena solusi {n, x} = {1, i} akan cukup jika itu adalah pilihan terbaik. Jadi x tidak perlu lebih kecil dari 2, yang berarti bahwa n * 2 ^ n ≤ i, dan semua n tersebut kurang dari 2 * ln (i).

Seseorang dapat menunjukkan menggunakan kalkulus bahwa pasangan {n, x} yang meminimalkan jumlah mereka dalam konteks ini sama dengan pasangan {n, x} dengan n terbesar (tidak termasuk {i, 1}). Itu sebabnya yang awal Lastcukup baik untuk menemukan pasangan yang optimal.


1
Anda dapat menyusun kondisi pengujian menggunakan IntegerQ@*Lastuntuk menyimpan 2 byte, tetapi saya juga menghitung 63 bukan 86 byte dalam versi saat ini.
mil

3

MATL , 22 byte

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

Outputnya x, ndalam urutan itu.

Input dibatasi oleh tipe doubledata standar MATL , yang dapat secara akurat mewakili bilangan bulat hingga 2^53hanya. Ini tidak termasuk tes pertama (masih, ini memberikan hasil yang benar, tetapi itu tidak dapat dijamin secara umum untuk input yang sangat besar).

Cobalah online!

Penjelasan

Kode ini menggunakan dua loop bersarang:

  • do...whileLingkaran luar melewati semua jumlah yang mungkin n+xdalam urutan yang meningkat. Loop akan dihentikan segera setelah solusi ditemukan. Ini menjamin bahwa kami mengeluarkan solusi dengan jumlah minimum.
  • for eachLoop dalam menguji semua ndan xdengan jumlah itu. Ketika jumlah bertepatan dengan input, loop dalam keluar dan kondisi loop dari loop luar diatur ke falsesehingga satu keluar juga.

Kode yang dikomentari:

`         % 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

Jelly , 23 16 byte

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

Mengingat i, ini menghasilkan semua pasangan bilangan bulat dengan penggantian masuk [1, i]. Kemudian melakukan penyaringan dan penyortiran yang sama seperti pada solusi sebelumnya yang ditunjukkan di bawah ini. Karena tidak ada batasan waktu, brute force akan bekerja diberikan waktu yang cukup.

Cobalah online! , tetapi jangan mencoba nilai besar secara online.

Di pc saya, dibutuhkan sekitar 6 menit untuk menghitung hasilnya karena i = 2048menggunakan versi yang tidak efisien.

Versi efisien

Ini adalah solusi sebelumnya untuk 23 byte yang mampu menyelesaikan nilai besar dengan cepat.

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

Diberikan i, menghitung pembagi iuntuk menghasilkan pasangan di [n, x]mana npembagi dan x = floor( (i/n)^(1/n) ). Kemudian saring untuk nilai di mana n * x^n == i, urutkan pasangan yang tersisa berdasarkan jumlah mereka, dan kembalikan pasangan pertama.

Cobalah online! atau Verifikasi semua kasus uji.

Penjelasan

×*@¥/=³  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 Bytes

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

Ini menghasilkan semua solusi yang mungkin tidak dalam format yang diusulkan 73 Bytes

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

1

Perl, 52 byte

Termasuk +2 untuk -ap

Berikan masukan pada STDIN

mono.pl <<< 33044255768277

mono.pl:

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

Butuh upaya untuk membuatnya bekerja 1juga. Saya tidak tahu apakah kesalahan floating point dapat membuat ini mengembalikan jawaban yang salah untuk beberapa input.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.