Найти все


13

Вступление

В теории чисел мы говорим, что число является k гладким, когда все его простые множители не больше k . Так , например, 2940 : 7-гладкой , так как 2940=223572 .

Здесь мы определяем k -гладкую пару как два последовательных целых числа, оба из которых k -гладкие. Пример 7-гладкой пары будет (4374,4375) , так как 4374=237 и 4375=547 . Забавный факт: это на самом деле самая большая пара из 7-гладких .

В 1897 году Штермер доказал, что для каждого k существует только конечное число k -гладких пар , и этот факт известен как теорема Штермера .

Вызов

Ваша задача - написать программу или функцию, которая при заданном вводе простого числа k выводит или возвращает все k -гладкие пары без дубликатов (порядок внутри пары не имеет значения) в любом порядке.

Следует отметить, что для простых чисел p и q , предполагая, что p<q , все p -гладкие пары также являются q -гладкими парами.

Образец ввода / вывода

Input: 2
Output: (1, 2)

Input: 3
Output: (1, 2), (2, 3), (3, 4), (8, 9)

Input: 5
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (8, 9), (9, 10), (15, 16), (24, 25), (80, 81)

Input: 7
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (14, 15),
        (15, 16), (20, 21), (24, 25), (27, 28), (35, 36), (48, 49), (49, 50), (63, 64),
        (80, 81), (125, 126), (224, 225), (2400, 2401), (4374, 4375)

ограничение

Программа или функция должны теоретически завершаться за конечное время для всех входов. Стандартные лазейки по умолчанию запрещены.

Критерии победы

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


2
Не могли бы вы добавить контрольные примеры для 2, 3 и 5?
Джонатан Аллан

@JonathanAllan 2-, 3- и 5-гладкие пары включены в 7-гладких пар, но я добавлю случаи для ясности
Шиеру Асакото

1
(1, 2)Обязательна ли часть выходных данных? ..
Кевин Круйссен,

@KevinCruijssen Да, все выходы должны содержать (1, 2)пару.
Шиеру Асакото

Ответы:


10

JavaScript (ES7),  234  232 байта

Находит решения путем решения уравнений Пелла вида x22qy2=1 , где q - P -гладкое квадратное свободное число.

Это реализация процедуры Деррика Генри Лемера , основанная на оригинальной процедуре Штермера.

Возвращает объект, ключи и значения которого описывают P -гладкие пары.

P=>[...Array(P**P)].map((_,n)=>(s=(n,i=0,k=2)=>k>P?n<2:n%k?s(n,i,k+1):s(n/k,i,k+i))(n,1)&&(_=>{for(x=1;(y=((++x*x-1)/n)**.5)%1;);(h=(x,y)=>k--&&h(X*x+n*Y*y,X*y+Y*x,x&s(x=~-x/2)&s(x+1)?r[x]=x+1:0))(X=x,Y=y,k=P<5?3:-~P/2)})(),r={})&&r

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

Как?

Вспомогательная функция s проверяет, является ли данное целое число n гладким P числом, когда оно вызывается с i=0 , или свободным 1- гладким числом P когда оно вызывается с i=1 .

s = (
  n,
  i = 0,
  k = 2
) =>
  k > P ?
    n < 2
  :
    n % k ?
      s(n, i, k + 1)
    :
      s(n / k, i, k + i)

Мы ищем все квадратные свободные 1 P -гладкие числа в [1..PP1] , гдеPP используется в качестве верхней границы дляP!,

P=>[...Array(P ** P)].map((_, n) => s(n, 1) && (...))

Для каждого числа n найденного выше, мы ищем фундаментальное решение уравнения Пелла x2ny2=1 :

(_ => {
  for(x = 1; (y = ((++x * x - 1) / n) ** .5) % 1;);
  ...
})()

(приведенный выше код является нерекурсивной версией моего ответа на этот другой вызов )

Когда фундаментальное решение (x1,y1) найдено, мы вычисляем решения (xk,yk) с kmax(3,(P+1)/2) , используя рекуррентные соотношения:

xk+1=x1xk+ny1ykyk+1=x1yk+y1xk

Для каждого xk мы проверяем, является ли xk нечетным и оба (xk1)/2 и (xk+1)/2 являютсяP гладкими. Если это так, мы храним их в объектеr .

( h = (x, y) =>
  k-- &&
  h(
    X * x + n * Y * y,
    X * y + Y * x,
    x &
    s(x = ~-x / 2) &
    s(x + 1) ?
      r[x] = x + 1
    :
      0
  )
)(X = x, Y = y, k = P < 5 ? 3 : -~P / 2)

1: поскольку она не проверяет простоту делителей, функция s будет действительно верна для некоторых не квадратичных свободных чисел, даже если она вызывается с i=1 . Идея состоит в том, чтобы отфильтровать большинство из них, чтобы было решено не слишком много бесполезных уравнений Пелла.


Привет, Арно! Я просто не мог обернуть голову вокруг этих двух:x = ~-x / 2 и. -~P / 2Это какое-то закругление ...
Рахул Верма

1
@ rv7 ~x- побитовое НЕ, которое вычисляет -(x+1). Следовательно, ~-xесть -(-x+1)= x-1и -~xесть -(-(x+1))= x+1. Как и все побитовые операции в JS, учитывается только 32-битная целочисленная часть. Таким образом, они действительно могут быть использованы для округления. Но оба иx уже являются целыми числами. P
Арно

4

Желе , 16 14 байтов

4*ÆfṀ<ɗƇ‘rƝLÐṂ

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

Проверяет на пары до 4k что неэффективно для большихk но должно гарантировать, что ни одно не пропущено.

Спасибо @JonathanAllan за сохранение 1 байта!

объяснение

4*ÆfṀ<ɗƇ‘rƝLÐṂ  | Monadic link, input k

4*              | 4**k, call this n
      ɗƇ        | For each number from 1..n filter those where:
  Æf            |   - Prime factors
    Ṁ           |   - Maximum
     <  ‘       |   - Less than k+1
         rƝ     | Inclusive range between neighbouring values
           LÐṂ  | Keep only those of minimum length (i.e. adjacent values)

1
Вы уверены, что всегда будет достаточно большим? В моем решении я использовал k ! 2 но Джонатан Аллан не был уверен, что он всегда будет достаточно большим. Если 4 k всегда работает, мне было бы интересно услышать объяснение. 4kk!24k
Товарищ SparklePony

1
Спасибо за быстрый ответ. Я думал так же, но в более широком смысле: «факториал быстро растет, вероятно, он достаточно велик». (оказывается, что не было, если я не возводил это в квадрат). Поздравляю с более коротким и более эффективным гольфом, у вас есть мой голос.
Товарищ SparklePony

1
Примечание (из oeis.org/A002072 ) «a (n) <10 ^ n / n, за исключением n = 4 (предположительно, из экспериментальных данных.) - М. Ф. Хаслер, 16 января 2015 г.». Я думаю, что мы должны придерживаться слабой границы Лемера в projecteuclid.org/download/pdf_1/euclid.ijm/1256067456 (теорема 7), если мы не можем доказать обратное.
Джонатан Аллан

2
... есть открытый вопрос по математике SE, задающий именно это тоже!
Джонатан Аллан

1
@PeterTaylor это количество пар, а не максимальное количество. Проблема в том, что ограничение максимального числа пар не позволяет вам прекратить поиск
Ник Кеннеди


2

Желе , 123 байта

¹©Æ½Ø.;µU×_ƭ/;²®_$÷2ị$}ʋ¥⁸;+®Æ½W¤:/$$µƬṪ€F¹;Ḋ$LḂ$?ṭ@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ịWµ1ịżU×®W¤Ɗ$æ.0ị$ṭµ³’H»3¤¡
ÆRŒPP€ḟ2ḤÇ€ẎḢ€+€Ø-HÆfṀ€<ẠʋƇ‘

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

2×Максимум(3,К+12)Икс-12,Икс+12гладкие для каждого решения. Это метод Лемера, описанный в ссылке на вопрос в Википедии .

Полная программа, которая принимает один аргумент, Ки возвращает список списков пар. Приведенный выше код не сортирует окончательный результат, но ссылка TIO делает.


2

Haskell , 118 107 байтов

-11 байт благодаря Ними

q 1=[1]
q n=(:)<*>q.div n$[x|x<-[2..n],mod n x==0]!!0
f k|let r=all(<=k).q=[(n,n+1)|n<-[1..4^k],r n,r(n+1)]

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

  • q n вычисляет список всех основных факторов n
  • f k генерирует список К-гладкие пары для данного k путем фильтрации списка всех пар

1
Вы можете перебрать [2..n]внутри pи вставить его в q. Попробуйте онлайн!
Ними

1

Желе , 24 байта

³!²R‘Ė
ÇÆFḢ€€€’<³FȦ$€Tị¢

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

Это занимает много времени для 7, но вычисляется намного быстрее, если вы уберете квадрат факториала: попробуйте онлайн!

Объяснение:

³!²R‘Ė                Generates a list like [[1,2],[2,3],...]
³!²                  Take the square of the factorial of the input
   R                 Range 1 through through the above number.
    ‘Ė               Decrement and enumerate, yielding desired list


ÇÆFḢ€€€’<³FȦ$€Tị¢  
Ç                    Get the list of pairs  
 ÆF                  Get the prime factors of each number
   Ḣ€€€              Get the base of each
       ’<³           Is each base less than or equal to the input?
          FȦ$€       Check that all bases of a pair fit the above.
              T      Get a list of the truthy indexes
               ị¢    Index into the original list of pairs
                     Implicit output

-3 байта благодаря @JonathanAllen


1
Я не читаю Желе, можете ли вы объяснить, как это работает?
Воплощение невежества

Я не думаю, что это работает - не (8,9)3-гладкая пара, так как8знак равно23 и 9знак равно32?
Джонатан Аллан

Я не уверен, что это так. Что заставляет вас думать, что будет держать?
Джонатан Аллан

@JonathanAllan Наивный оптимизм и факт для всех примеров, которые я видел (по общему признанию, не много), самая большая пара меньше чем k!(кроме 3, у которого есть маленький факториал, потому что это небольшое число).
Товарищ SparklePony

1
Верхняя граница, которую вы используете, относится к максимальному числу, используемому в паре, а не к количеству пар (вы не можете таким образом реализовать верхнюю границу для количества пар, так как не знаете, когда прекратить искать!) См. Теорему 7 для верхней оценки произведения наибольшей пары.
Джонатан Аллан

1

Python 3 + sympy, 116 байт

import sympy
def f(k):x=[i for i in range(2,4**k)if max(sympy.factorint(i))<=k];return[(y,y+1)for y in x if y+1in x]

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

Python 3 + sympy, 111 байт

from sympy import*
def f(k):
 b=1
 for i in range(2,4**k):
  x=max(factorint(i))<=k
  if x&b:print(i-1,i)
  b=x

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

Две вариации на мой ответа Jelly, но в Python 3. Они оба определяют функцию, которая принимает аргумент k. Первый возвращает список кортежей пар, которые соответствуют критериям. Второй выводит их на стандартный вывод.




1

05AB1E , 16 байтов

°LʒfàI>‹}Xšü‚ʒ¥`

Попробуйте онлайн (крайне неэффективно, поэтому время ожиданияN>3..). Здесь немного более быстрая альтернатива , хотя все еще довольно медленная ..

Объяснение:

°                # Take 10 to the power of the (implicit) input
 L               # Create a list in the range [1, 10^input]
  ʒ              # Filter this list by:
   fà            #  Get the maximum prime factor
     I>‹         #  And check if it's smaller than or equal to the input
        }Xš      # After the filter: prepend 1 again
           ü‚    # Create pairs
             ʒ   # And filter these pairs by:
              ¥` #  Where the forward difference / delta is 1

0

Stax , 14 байт

Θ",²aÇu,á‼⌐çLB

Запустите и отладьте его

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


0

Рубин , 89 + 8 = 97 байт

Использует -rprimeфлаг. Для каждого номерая от 1 до 4N, сопоставьте его, [i, i+1]если обаN-Smooth, в противном случае сопоставьте его false, затем удалите все falseиз списка.

->n{g=->x{x.prime_division.all?{|b,_|b<=n}};(1..4**n).map{|i|g[i]&&g[i+1]&&[i,i+1]}-[!1]}

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

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