最大素数指数


22

给定一个整数n >= 2,输出其素数分解中的最大指数。这是OEIS序列A051903

n = 144。其主要分解为2^4 * 3^2。最大指数是4

测试用例

2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 1
7 -> 1
8 -> 3
9 -> 2
10 -> 1
11 -> 1
12 -> 2
144 -> 4
200 -> 3
500 -> 3
1024 -> 10
3257832488 -> 3

Answers:







4

Python 2,78个字节

n=input()
e=m=0
f=2
while~-n:q=n%f<1;f+=1-q;e=q*-~e;m=max(m,e);n/=f**q
print m

在线尝试!

-5感谢ovs

这个答案不做质数检查。取而代之的是,它利用了一个事实,即质数的最高指数将大于或等于任意数的因式分解中任何其他因数的指数。



@ovs谢谢,错过了当我尝试快速发帖时
Erik the Outgolfer


@ovs终于,从if / else那里放松了,谢谢
Outgolfer的Erik

4

Japt -h9 7字节

k ü mÊn

试试吧

k ü mÊn     :Implicit input of integer
k           :Prime factors
  ü         :Group by value
    m       :Map
     Ê      :  Length
      n     :Sort
            :Implicit output of last element

2
我觉得这应该更短一些,也许我应该为质数对添加一个内置函数……
ETHproductions 17-10-23

为什么使用“ü:按值分组”而不是排序功能?是的,也许是因为sort返回一个数组,但是我们需要一个数组...
RosLuP

1
@RosLuP,完全正确;ü创建相等值的子数组。它确实还排序值第一,但在这里,是不相关的。
毛茸茸的






2

Javascript 54个字节

*假设无限堆栈(如代码高尔夫球挑战中那样)

P=(n,i=2,k)=>i>n?k:n%i?k>(K=P(n,i+1))?k:K:P(n/i,i,-~k)

console.log(P(2 )== 1)
console.log(P(3 )== 1)
console.log(P(4 )== 2)
console.log(P(5 )== 1)
console.log(P(6 )== 1)
console.log(P(7 )== 1)
console.log(P(8 )== 3)
console.log(P(9 )== 2)
console.log(P(10 )== 1)
console.log(P(11 )== 1)
console.log(P(12 )== 2)
console.log(P(144 )== 4)
console.log(P(200 )== 3)
console.log(P(500 )== 3)
console.log(P(1024 )== 10)
//console.log(P(3257832488 )== 3)



2

八度,25字节

@(n)[~,m]=mode(factor(n))

在线尝试!

说明

factor产生(可能重复的)质数指数数组。的第二个输出mode给出模式(即,最重复的项)出现的次数。




1

盖亚 4字节

ḋ)⌠)

在线尝试!

  • -将素数分解计算为[素数,指数]对。

    • -以最大值映射并收集结果。

    • ) -最后一个元素(指数)。

    • ) -最后一个元素(最大指数)

盖亚 4字节

ḋ)¦⌉

在线尝试!

  • -将素数分解计算为[素数,指数]对。

    • -使用最后一个元素(指数)进行映射。

    • -获取最大元素。



1

八度:30字节

@(x)max(histc(a=factor(x),a));
  1. a=factor(x)返回包含的素因子的向量x。这是一个按升序排序的向量,其中所有数字的乘积本身会factor(x)产生x,使得向量中的每个数字都是质数。
  2. histc(...,a)计算素因子向量的直方图,其中bin是素因子。直方图计算我们看到每个质数的次数,从而得出每个质数的指数。我们可以在这里作弊,因为即使factor(x)将返回重复的数字或bin,但只有一个bin会捕获我们看到质数的总次数。
  3. max(...) 因此返回最大指数。

在线尝试!


1

爱丽丝,17个字节

/o
\i@/w].D:.t$Kq

在线尝试!

说明

/o
\i@/...

这只是带有十进制I / O的简单算法程序的框架。的...是实际的计划,该计划已经在堆栈上的输入和叶堆栈的顶部输出。

爱丽丝实际上具有内置功能来获取整数的质数分解(即使具有质数-指数对),但是我使用它们得出的最短长度是10字节。

取而代之的是,我们将输入中每个不同素数的一个副本重复除以1,直到达到1。采取的步骤数等于最大的质数指数。我们将滥用磁带头作为计数器变量。

w      Remember the current IP position. Effectively starts a loop.
  ]      Move the tape head to the right, which increments our counter.
  .D     Duplicate the current value, and deduplicate its prime factors.
         That means, we'll get a number which is the product of the value's
         unique prime factors. For example 144 = 2^4 * 3^2 would become
         6 = 2 * 3.
  :      Divide the value by its deduplicated version, which decrements the
         exponents of its prime factors.
  .t     Duplicate the result and decrement it. This value becomes 0 once we
         reach a result of 1, which is when we want to terminate the loop.
$K     Jump back to the beginning of the loop if the previous value wasn't 0.
q      Retrieve the tape head's position, i.e. the number of steps we've taken
       through the above loop.

1

朱莉娅60 52 40字节

f(x)=maximum(collect(values(factor(x))))

-12 +更正归功于Steadybox


1
我认为您需要添加一个呼叫print()。另外,我无法按原样在TIO上运行代码,我认为它可以在该语言不可用的其他版本上运行?这在TIO上运行良好: print(maximum(collect(values(factor(parse(BigInt,readline()))))))
Steadybox

这在解释器上有效(至少在我的计算机上)。这也将引发警告,因为不建议像这样初始化BigInt。但是,如果将代码原样复制并粘贴到Julia解释器中,它应该可以工作。(如果需要打印,因为必须明确打印,请放

1
print()之所以需要,是因为答案必须是完整的程序(显示输出)或函数(返回输出)。否则,您的解决方案就可以了。看来您可以这样保存一些字节(并避免打印):f(x)=maximum(collect(values(factor(x))))
Steadybox

1
别客气!是有关解决方案允许使用的格式的元文章。
Steadybox

0

实际上,4个字节

w♂NM

在线尝试!

w♂NM-完整程序。

w-将素因式分解推为[prime,exponent]对。
 ♂N-获取每个的最后一个元素(指数)。
   M-最大值。

我使用了这种精确的解决方案来编写测试用例:)
Mego

@Mego您认为它会变短吗(如果您要变短,我不希望您宠坏它,只是问一下)?:)
Xcoder先生17年

不,我认为这实际上是最佳选择。
Mego

0

Python 2,64个字节

-4个字节感谢H.PWiz。

lambda n:max(a*(n%k**a<1)for a in range(n)for k in range(2,-~n))

在线尝试!

H.PWiz的Haskell答案端口。我之所以仅分享这些内容,是因为我能够理解这段Haskell代码并进行翻译,对此我感到很自豪。:P


难道range(1,n)不行?
H.PWiz

range(1, n)产生[1,n)中的所有整数。
完全人类

1
嗯,好吧,您实际上并不需要一直上升到na
H.PWiz

哦,好吧,我不完全了解其背后的数学原理。:P谢谢!
完全人类


0

公理,61字节

f n==(a:=factors n;reduce(max,[a.i.exponent for i in 1..#a]))

这是我第一次发现无需使用()括号就可以定义函数。代替“ f(n)==”“ fn ==”少一个字符...


0

球拍83 79字节

(λ(n)(cadr(argmax cadr((let()(local-require math/number-theory)factorize)n))))

在线尝试!

(我不确定在什么上构成一个完整的Racket解决方案是否达成共识,因此我将采用纯函数才重要的Mathematica约定。)

怎么运行的

factorize给人的分解成对列表:(factorize 108)'((2 2) (3 3))。一对的第二个元素由给出cadr,表示car(列表的头部)与cdr(列表的尾部)的简写。

我觉得很愚蠢,(cadr (argmax cadr list))无法找到第二个元素的最大值,但是max对列表(max (map cadr list))不起作用:没有做我们想要的事情。我不是球拍专家,所以也许有一种更好的标准方法。

球拍,93字节

(λ(n)(define(p d m)(if(=(gcd m d)d)(+(p d(/ m d))1)0))(p(argmax(λ(d)(p d n))(range 2 n))n))

在线尝试!

怎么运行的

替代版本不会导入factorize,而是或多或少从头开始执行所有操作。该功能(p m d)发现的最高权力d划分m,然后我们随便找的最高值(p n d)d之间2n。(我们不需要将此限制为素数,因为不会有比素数更好的复合功效。)


我猜标准max解决方案是,(apply max (map cadr list)(cadr (argmax cadr list))不幸的是要短一些。
Misha Lavrov


0

APL(NARS),15个字符,30个字节

{⌈/+/¨v∘=¨v←π⍵}

测试:

  f←{⌈/+/¨v∘=¨v←π⍵}
  f¨2..12
1 1 2 1 1 1 3 2 1 1 2 
  f¨144 200 500 1024 3257832488
4 3 3 10 3 

评论:

{⌈/+/¨v∘=¨v←π⍵}
          v←π⍵    π12 return 2 2 3; assign to v the array of prime divisors of argument ⍵
      v∘=¨        for each element of v, build one binary array, show with 1 where are in v array, else puts 0 
                  return one big array I call B, where each element is the binary array above
   +/¨            sum each binary element array of  B
 ⌈/               get the max of all element of B (that should be the max exponet)
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.