Спасибо @Dennis за -2 байта!
for($x=$n=1;$n<$argv[1];)$n+=bcpowmod(7,++$x,$x**2)==1;echo$x;
Одноиндексная рекурсивная функция, которая принимает входные данные через аргумент и возвращает результат.
Попробуйте онлайн! (Увеличен лимит рекурсии, чтобы можно было выполнить финальный тестовый пример)
Как это работает
PHP_INT_MAX
is the desired index, and 7**9
является счетной переменной.
Выражение while($n<$argv[1])$n+=(7**++$x-1)%$x**2<1;echo$x;
returns z=1:1e6;which(gmp::as.bigz(7^z-1)%%z^2==0)[scan()]
(эквивалентно n<=25
) if z=1:20;which(!(7^z-1)%%z^2)[scan()]
делит n<=8
, and f=lambda n,k=2:n<2or-~f(n-(7**k%k**2==1),k+1)
(эквивалентно n->=k=1;for(i=2,n,while((7^k++-1)%k^2,));k
) otherwise. Each time the function is called, the result of the expression is subtracted from n->=k=1;while(n--,while((7^k++-1)%k^2,));k
, уменьшение 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,#]&
each time a hit is found; lambda n:[x for x in range(1,2**n+1)if(7**x-1)%x**2<1][n]
также увеличивается.
Короткое замыкание i=0
g=input()
while g:i+=1;g-=~-7**i%i**2<1
print i
means that when i
является i
, 0
возвращается; это базовый случай. Как только это достигается, рекурсия останавливается, и текущее значение -~
is returned by the original function call. Rather than explicitly using i
, это делается за счет того, что для каждого вызова функции приращение выполняется с помощью i
in front of the call; incrementing 0
0
times gives n
, как требуется.