Неправильно истолкованные мономы


9

Существует уравнение, предполагающее nи xположительное,

уравнение

это выражает отношения между двумя мономами, один из которых является распространенным искажением другого. Многие люди делают простую ошибку приравнивая их (то есть 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]?
Роковой

Кроме того, есть ли ограничение по времени?
Роковой

nи xцелые, верно?
Луис Мендо

Выходные данные в форме [n, x]и нет ограничения по времени @Fatalize
Зак Гейтс

Да, nи xявляются целыми числами @LuisMendo
Зак Гейтс

Ответы:


5

Брахилог , 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, x}, где x = (i / n) ^ (1 / n), используя все возможные значения 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, x} с наибольшим n (не считая {i, 1}). Поэтому начальная Lastбуква достаточно хороша, чтобы найти оптимальную пару.


1
Вы можете составить условие теста, используя IntegerQ@*Lastдля сохранения 2 байта, но я также считаю 63 не 86 байтов в этой текущей версии.
миль

3

MATL , 22 байта

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

Выходы x, nв таком порядке.

Вход ограничен типом doubleданных MATL по умолчанию , который может точно представлять только целые числа 2^53. Это исключает первый тест (тем не менее, он дает правильный результат, но это не может быть гарантировано в целом для входов такого размера).

Попробуйте онлайн!

объяснение

Код использует два вложенных цикла:

  • Внешний do...whileцикл проходит все возможные суммы n+xв порядке возрастания. Цикл будет остановлен, как только будет найдено решение. Это гарантирует, что мы выводим решение с минимальной суммой.
  • Внутренний for eachцикл проверяет все nи xс этой суммой. Когда сумма совпадает с входом, внутренний цикл завершается, и условие цикла внешнего цикла устанавливается falseтак, чтобы выход тоже был завершен .

Код комментария:

`         % 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]. Затем он выполняет ту же фильтрацию и сортировку, что и в предыдущем решении, показанном ниже. Поскольку нет ограничений по времени, грубая сила будет работать, если будет достаточно времени.

Попробуйте онлайн! , но не пытайтесь большие значения в Интернете.

На моем компьютере вычисление результата 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тоже. Я понятия не имею, могут ли ошибки с плавающей запятой возвращать неправильный ответ для некоторых входов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.