查找所有


13

介绍

在数论中,我们说一个数为k光滑的数,当它的主要因子最多为k。例如,2940是7-平滑因为2940=223572

在这里,我们将k平滑对定义为两个都是k平滑的连续整数。7光滑对一个例子将是(4374,4375),因为4374=2374375=547有趣的事实:这实际上是最大的7平滑对

斯托默(Størmer)在1897年证明,对于每k,只有有限的k平滑对,并且这一事实被称为斯托默定理

挑战

您的任务是编写一个程序或函数,给定素数输入k,以您想要的任何顺序输出或返回所有k平滑对,而没有重复(对内的顺序无关紧要)。

请注意,对于质数pq,假设p<q,则所有p平滑对也是q平滑对。

样品I / O

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个平滑对中,但是为了清楚起见,我将添加这些案例
Shieru Asakoto

1
是否必须(1, 2)部分输出?
凯文·克鲁伊森

@KevinCruijssen是的,所有输出都应包含该(1, 2)对。
浅草雅人

Answers:


10

JavaScript(ES7), 234  232字节

通过求解形式为x22qy2=1 Pell方程来找到解,其中qP光滑平方自由数。

这是德里克·亨利·莱默Derrick Henry Lehmer)的程序的一种实现,该程序是从斯托默(Størmer)的原始程序派生而来的。

返回一个对象,其键和值描述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调用i = 0时测试给定整数nP光滑数,还是在i = 1调用给定整数n是自由平方的1 P光滑数。i=0 Pi=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,我们寻找Pell方程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

xkxk(xk1)/2(xk+1)/2Pr

( 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)

si=1


嗨Arnauld!我只是不能换我的头两个办法:x = ~-x / 2-~P / 2.Are这些某种四舍五入的...
拉胡尔·维尔马

1
~x-(x+1)~-x-(-x+1)x-1-~x-(-(x+1))x+1xP

4

果冻16 14字节

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

在线尝试!

4kk

感谢@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
4kk!24k

1
感谢您及时的回复。我当时的想法与此类似,但范围更广:“阶乘很快就变得很高,可能足够大了。” (结果是除非我平方了,否则它不是)。恭喜矮个子,更高效的高尔夫,我对此表示赞成。
“ SparklePony同志” 19年

1
注意(来自oeis.org/A002072)“a(n)<10 ^ n / n,n = 4除外。(根据实验数据推测。)-MF Hasler,2015年1月16日”。我认为除非另有说明,否则我们必须坚持Lehmer的弱势界限(projecteuclid.org/download/pdf_1/euclid.ijm/1256067456(定理7))。
乔纳森·艾伦,

2
...在数学SE上也有一个悬而未决的问题!
乔纳森·艾伦,

1
@PeterTaylor用于配对数,而不是最大数目。问题是知道最大对数上的界限不会让您停止搜索
Nick Kennedy

3

05AB1E,8个字节

°Lü‚ʒfà@

在线尝试!

说明:

°            # 10 ** the input
 Lü‚         # list of pairs up to that number
    ʒ        # filtered by...
     fà      # the greatest prime factor (of either element of the pair)...
       @     # is <= the input

2

果冻,123字节

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

在线尝试!

2×max(3,k+12)x12,x+12

k



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)8=239=32

我不确定是不是。是什么让您认为那会成立?
乔纳森·艾伦,

@JonathanAllan幼稚的乐观态度以及我所见过的所有示例的事实(诚然不多),最大的一对小于k!(除了3之外,它的阶乘很小,因为它是一个很小的数字)。
“ SparklePony同志” 19年

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

Wolfram语言(Mathematica),241个字节

使用佩尔方程

(s=#;v@a_:=Max[#&@@@#&/@FactorInteger@a]<=s;Select[{#-1,#+1}/2&/@(t={};k=y=1;While[k<=Max[3,(s+1)/2],If[IntegerQ[x=Sqrt[1+2y^2#]],t~AppendTo~x;k++];y++];t),v@#&]&/@Join[{1},Select[Range[3,Times@@Prime@Range@PrimePi@s],SquareFreeQ@#&&v@#&]])&

在线尝试!



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

运行并调试

这不是最短的程序,但是一旦找到匹配对,它就会开始产生输出。它最终会终止,但是会根据发现产生输出。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.