Числа x такие, что x ^ 2 делит 7 ^ x-1


16

задача

Существует набор чисел x, такой, который x^2делит 7^x-1.

Ваша задача найти эти цифры. При вводе n код напечатает n-е число, следующее за этим правилом.

Примеры 1-индекс

In   Out
3    3
9    24
31   1140

Соответствующая последовательность может быть найдена здесь .

правила

Кратчайший ответ будет победителем *

Применяются стандартные правила игры в гольф

Лазейки не допускаются

Ваш ответ может быть 0 или 1 проиндексирован, пожалуйста, укажите в своем ответе


@nimi Я записал их при планировании и никогда не реализовывал их. Я обновил этот вопрос
ДЖОРДЖ

Каковы пределы n? Я могу дать правильный результат с n=9, но n=10уже вызывает у меня проблемы.
бриантист

@briantist Если вы получаете неправильный результат для более высоких входных значений, ваш ответ неверен. Если это займет много времени, это может зависеть от реализации.
mbomb007

Это не просто занимает много времени. n=10дает мне 32; это потому, что он начинает использовать double вместо целых чисел, и после этого мод становится неправильным. :(
Бриантист

Ответы:


8

Haskell, 34 байта

([x|x<-[1..],mod(7^x-1)(x^2)<1]!!)

При этом используется индексирование на основе 0. Пример использования: ([x|x<-[1..],mod(7^x-1)(x^2)<1]!!) 30-> 1140.

Это прямая реализация определения. Он строит список всех чисел xи выбирает их n.


5

Pyth , 10 байт

e.f!%t^7Z*

Программа, которая принимает ввод целого числа и печатает одноиндексное значение.

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

Как это устроено

e.f!%t^7Z*     Program. Input: Q
e.f!%t^7Z*ZZQ  Implicit variable fill
               Implicitly print
e              the last
 .f         Q  of the first Q positive integers Z
     t^7Z      for which 7^Z - 1
    %          mod
         *ZZ   Z^2
   !           is zero

5

JavaScript (ES7), 40 байт

f=(n,i=1)=>n?f(n-!((7**++i-1)%i**2),i):i

Это теряет точность довольно быстро из-за того, что JS теряет точность по 7**19. Вот версия ES6 почти произвольной точности:

f=(n,i=0)=>n?f(n-!(~-(s=++i*i,g=j=>j?g(j-1)*7%s:1)(i)%s),i):i

Это заканчивается примерно за секунду для контрольного примера 31.

Несколько более длительных подходов:

f=(n,i=0)=>n?f(n-!(~-(s=>g=j=>j?g(j-1)*7%s:1)(++i*i)(i)%s),i):i
f=(n,i=0)=>n?f(n-!(s=++i*i,g=(j,n=1)=>j?g(j-1,n*7%s):~-n%s)(i),i):i
f=(n,i=0)=>n?f(n-!(s=>g=(j,n=1)=>j?g(j-1,n*7%s):~-n%s)(++i*i)(i),i):i

4

05AB1E , 11 байт

µ7Nm<NnÖiN¼

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

По какой-то причине я не могу попасть ½на работу µ7Nm<NnÖ½Nили меня связывают с Пифом.

µ           # Loop until the counter equals n.
 7Nm<       # Calc 7^x+1.
     Nn     # Calc x^2.
       Ö    # Check divisibility.
        iN¼ # If divisible, push current x and increment counter.
            # Implicit loop end.
            # Implicitly return top of stack (x)

,


Да, у меня была эта причуда Öв моем списке исправлений в течение нескольких месяцев, но я никогда не удосужился разобраться с этим. В любом случае, вам не нужно , Nкак µавтоматически выводит последние , Nесли стек пуст.
Эминья

4

Python 2 , 48 46 байт

Спасибо @Dennis за -2 байта!

f=lambda n,i=1:n and-~f(n-(~-7**i%i**2<1),i+1)

Одноиндексированная рекурсивная функция, которая принимает входные данные через аргумент и возвращает результат.

Попробуйте онлайн!(Предел рекурсии увеличен для запуска финального контрольного примера)

Как это устроено

nжелаемый индекс, и iявляется переменной подсчета.

Выражение ~-7**i%i**2<1возвращает True(эквивалентно 1), если i^2делит 7^i - 1, и False(эквивалентно 0) в противном случае. Каждый раз, когда вызывается функция, результат выражения вычитается из n, уменьшаясь при nкаждом обнаружении попадания; iтакже увеличивается.

Короткое замыкание andозначает, что когда nесть 0, 0возвращается; это базовый случай. Как только это достигается, рекурсия останавливается, и текущее значение iвозвращается исходным вызовом функции. Вместо того, чтобы явно использовать iэто, это делается с использованием того факта, что для каждого вызова функции выполняется приращение -~перед вызовом; 0 iвремя приращения дает i, по мере необходимости.


1
(~-7**i%i**2<1)сохраняет пару байтов.
Деннис

@ Денис Конечно! Благодарю.
TheBikingViking

3

Python 2 , 57 53 51 байт

-4 байта благодаря ETHproductions
-2 байта благодаря TuukkaX

i=0
g=input()
while g:i+=1;g-=~-7**i%i**2<1
print i

Попробуйте онлайн!
последовательность 1-индексирована


@ETHproductions yep c:
Род

Сбой теста, если вы удалите круглые скобки (7**i)? Я удалил их, и это сработало для тех, которые я попробовал.
Yytsi

@TuukkaX действительно, **имеет более высокий приоритет , чем ~и-
Rod

2

Python 2, 57 байт

Это занимает очень, очень много времени для больших значений. Он также использует много памяти, потому что он строит весь список дальше, чем необходимо. Результат индексируется нулем.

lambda n:[x for x in range(1,2**n+1)if(7**x-1)%x**2<1][n]

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


из любопытства, есть ли доказательство для 2**n+1верхнего предела?
Род

@Rod Не то, что я знаю, но, учитывая, что 50 значений <5000, я уверен, что намного больше, чем 50 < 2**50. Я мог бы использовать 9**n+9, но это занимает гораздо больше времени. Я начал бегать f(20)некоторое время назад (с 2**n+1); это все еще не закончено.
mbomb007

Я даже не думаю, что есть доказательство того, что последовательность бесконечна, не говоря уже о хорошей верхней границе для n-го члена!
Грег Мартин

2

Mathematica, 43 байта

В настоящее время у меня есть три разных решения с таким количеством байтов:

Nest[#+1//.x_/;!(x^2∣(7^x-1)):>x+1&,0,#]&
Nest[#+1//.x_/;Mod[7^x-1,x^2]>0:>x+1&,0,#]&
Nest[#+1//.x_:>x+Sign@Mod[7^x-1,x^2]&,0,#]&

Какой символ находится между x ^ 2 и (7 ^ x ... в первой строке? Это похоже на трубу, но короче
Sefa

@Sefa Это символ Unicode для математического символа «делит» и используется Mathematica в качестве оператора для Divisible.
Мартин Эндер

Вот один из 41 байтов: Cases[Range[#^3],x_/;x^2∣(7^x-1)][[#]]&на основе эвристического аргумента, что n ^ 3 является верхней границей. Я обнаружил поистине изумительное доказательство этого, которое слишком узко для этого поля :)
Келли Лоудер

2

PARI / GP , 42 байта

Довольно просто. 1-индексированный, хотя это можно легко изменить.

n->=k=1;while(n--,while((7^k++-1)%k^2,));k

или

n->=k=1;for(i=2,n,while((7^k++-1)%k^2,));k


1

R 35 байт

Это работает только для n<=8.

z=1:20;which(!(7^z-1)%%z^2)[scan()]

Однако вот более длинная версия, которая работает n<=25на 50 байтов :

z=1:1e6;which(gmp::as.bigz(7^z-1)%%z^2==0)[scan()]

Это работает только 8потому, что он стал длинным int?
джордж

1
@george Да, вы теряете точность, поскольку R по умолчанию принимает 32-битные целые числа. Вторая версия кода использует пакет gmp, который допускает произвольно большие целые числа. Тем не менее, я быстро исчерпал ОЗУ для вычисления чего-либо выше n=25.
rturnbull

0

PHP, 47 49 байт

while($n<$argv[1])$n+=(7**++$x-1)%$x**2<1;echo$x;

Работает только для n <9 ( 7**9больше, чем PHP_INT_MAXс 64 бит)

62 байта с использованием целых чисел произвольной длины: (не проверено; PHP на моей машине не имеет bcmath)

for($x=$n=1;$n<$argv[1];)$n+=bcpowmod(7,++$x,$x**2)==1;echo$x;

Беги с php -nr '<code>' <n>.

псевдокод

implicit: $x = 0, $n = 0
while $n < first command line argument
    increment $x
    if equation is satisfied
        increment $n
print $x


0

Clojure , 83 байта

(fn[n](nth(filter #(= 0(rem(-(reduce *(repeat % 7N))1)(* % %)))(iterate inc 1N))n))

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

Это создает бесконечный список Java BigIntegers начиная с 1 и фильтрует их по определению. Он использует индексирование с нуля для выбора n- го значения из отфильтрованного списка.


0

Perl 5, 35 байт

Ну, этого не было, так что вот оно:

map{$_ if!((7**$_-1)%($_**2))}1..<>


0

Powershell, слишком много байтов

Просто чтобы увидеть, возможно ли это и так ли это.

[System.Linq.Enumerable]::Range(1,10000)|?{[System.Numerics.BigInteger]::Remainder([System.Numerics.BigInteger]::Pow(7,$_)-1,$_*$_) -eq 0}

0

Perl 6 , 35 34 байта

{grep({(7**$_-1)%%$_²},^∞)[$_]}

0 индексированные.

Скинул один байт благодаря Брэду Гилберту.


grep - подпрограмма, поэтому вы можете удалить пробел, если поставите после него {grep(…)}
символы скобок

0

QBIC , 39 байт

:{~(7^q-1)%(q^2)=0|b=b+1]~b=a|_Xq\q=q+1

Я не смог заставить его работать в QBasic 4.5, но, кажется, он работает нормально в QB64. По какой-то необъяснимой причине QBasic отказывается чисто делить 13 841 287 200 на 144, а вместо этого дает остаток -128. Затем он возвращает 16 как 7-й член этой последовательности вместо 12 ...

:{      get N from the command line, start an infinite DO-loop
~       IF
(7^q-1) Part 1 of the formula (Note that 'q' is set to 1 as QBIC starts)
%       Modulus
(q^2)   The second part
=0      has no remainder
|b=b+1  Then, register a 'hit'
]       END IF
~b=a    If we have scored N hits
|_Xq    Quit, printing the last used number (q)
\q=q+1  Else, increase q by 1. 
        [DO-loop and last IF are implicitly closed by QBIC]

0

Чудо , 28 байт

@:^#0(!>@! % - ^7#0 1^#0 2)N

Zero-индексироваться. Использование:

(@:^#0(!>@! % - ^7#0 1^#0 2)N)2

Фильтрует из списка натуральных чисел с предикатом, который определяет, x^2делится ли на 7^x-1, а затем получает n-й элемент в этом списке.


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