找到主要因素


23

在此任务中,您必须编写一个程序,该程序可以计算数字的素数。输入为自然数1 <n <2 ^ 32。输出是采用以下格式的数字素数的列表。如果指数为1,则必须省略。仅输出质数。(假设输入为131784):

131784 = 2 ^ 3 * 3 * 17 ^ 2 * 19

不需要使用相同数量的空格;可以在适当的地方插入空格。您的程序应在不到10分钟的时间内完成输入。字符数最短的程序获胜。


9
如果您的程序可以在73天内不到6857599914349403977654744967172758179904114264612947326127169976133296980951450542789808884504301075550464464802304019795402754670660318614966266413770127以积分奖励积分!
乔伊·亚当斯

@Joey Adams:因式分解开始于17 * 71 * 113 * 997 * 313597 ...
FUZxxl 2011年

3
@FUZxxl:我认为您在复制号码时出错。它是两个大素数的乘积
乔伊·亚当斯

@Joey我们可以使用Shor算法吗?
Mateen Ulhaq

23
@Joey我不小心在我的量子计算机上洒了些咖啡,而我的朋友正在用他的咖啡“入侵美国政府”或其他无关紧要的东西,所以,没有。:(
Mateen Ulhaq,2011年

Answers:


11

SageMath,31字节

N=input()
print N,"=",factor(N)

测试用例: 83891573479027823458394579234582347590825792034579235923475902312344444 输出:

83891573479027823458394579234582347590825792034579235923475902312344444 = 2^2 * 3^2 * 89395597 * 98966790508447596609239 * 263396636003096040031295425789508274613


恭喜您在第一篇博文中赢得了挑战,不错的工作!欢迎来到该网站!
DJMcMayhem

8

Ruby 1.9, 74 70个字符

#!ruby -plrmathn
$_+=?=+$_.to_i.prime_division.map{|a|a[0,a[1]]*?^}*?*

编辑:

  • (74-> 70)只需将指数用作切片长度,而不是显式检查 exponent > 1

7

Perl 5.10、73 88

perl -pe '$_=`factor $_`;s%( \d+)\K\1+%-1-length($&)/length$1%ge;y, -,*^,;s;\D+;=;'

从标准输入中获取输入编号。如果提供,将计算多个输入的因子。

算作与的差额perl -e\K正则表达式元字符需要5.10 。


+1以使用factor
st0le 2011年

您不算这个 p选项吗?
乔伊,

@Joey我确实应该。对于那个很抱歉。定影。
JB

还没有测试过,但是split/\D/,~factor $_~;$_="@_";你不能写$_=~factor $_~;s/\D/ /g;吗?(当然~要用反引号代替。)
Timwi

你的意思是$_=`factor $_`;s/\D/ /g;?双重反引号包围有帮助。
aaaaaaaaaaaaaa

5

OCaml,201个字符

最佳Python代码的直接命令翻译:

let(%)s d=if!d>1then Printf.printf"%s%d"s!d
let f n=let x,d,e,s=ref n,ref 1,ref 0,ref"="in""%x;while!d<65536do
incr d;e:=0;while!x mod!d=0do x:=!x/ !d;incr e
done;if!e>0then(!s%d;"^"%e;s:="*")done;!s%x

例如,

# f 4294967292;;
4294967292=2^2*3^2*7*11*31*151*331- : unit = ()

(请注意,我省略了输出最终的结束语。)只是为了娱乐,功能性的版本只有213个字符,通过自由使用运算符将​​其彻底混淆了:

let(%)s d=if d>1then Printf.printf"%s%d"s d
let f x=let s=ref"="in""%x;let rec(@)x d=if d=65536then!s%x else
let rec(^)x e=if x/d*d<x then x,e else x/d^e+1in
let x,e=x^0in if e>0then(!s%d;"^"%e;s:="*");x@d+1in x@2

5

Python,140135133 字符

M=N=input()
s=''
f=1
while f<4**8:
 f+=1;e=0
 while N%f<1:e+=1;N/=f
 if e:s+='*%d'%f+'^%d'%e*(e>1)
print M,'=',(s+'*%d'%N*(N>1))[1:]

我想输出需要更多的空间,如' * %d'...而两两件事:65536 == 4**8; 7号线:if e:s+='*%d'%f+'^%d'%e*(e>1)
Oleh Prypin 2011年

@BlaXpirit:“不需要相同数量的空格”。感谢其他两个,我将它们合并。
基思·兰德尔

5

J,72

(":*/f),'=',([,'*',])/(":"0~.f),.(('^',":)`(''"0)@.(=&1))"0+/(=/~.)f=.q:161784

典型的J。大部分工作由两个角色完成,而60个角色则可以完成。

编辑:固定字符数。


2
在我看来,这看起来不像62个字符。即使假设161784是您的输入,仍然是72个字符。
Ventero 2011年

会不会更短|: __ q: y
Eelvex 2011年

2
@Ventero:典型的JB。用两个小时打那该死的东西,用十五秒弄乱这个角色。
JB

5

J,53 52个字符

此解决方案采用了randomra解决方案中的rplc技巧,但也提出了一些原始想法。

":,'=',(":@{.,'^','*',~":@#)/.~@q:}:@rplc'^1*';'*'"_

在非默认表示法中,此功能变为

f =: 3 : 0
(": y) , '=' , }: (g/.~ q: y) rplc '^1*' ; '*'
)

在哪里g定义为

g =: 3 : 0
": {. y) , '^' , (": # y) , '*'
)
  • q: y是的向量质因数y。例如,q: 60yields 2 2 3 5
  • x u/. y适用uy 带键的通过x,即,u被施加到的元素的向量y为这在条目x是相等的。这是一个复杂的位来解释,但在特殊的情况y u/. yu/.~ yu被施加到在不同元件的每个矢量y,其中每个元素重复经常因为它出现在y。例如,</.~ 1 2 1 2 3 1 2 2 3收益

    ┌─────┬───────┬───┐
    │1 1 1│2 2 2 2│3 3│
    └─────┴───────┴───┘
    
  • # y吻合y,即在项目的数量y

  • ": y 格式化 y为字符串。
  • x , y 追加 xy
  • {. yhead y,即它的第一项。
  • 因此,将数字k(": {. y), '^' , (": # y) , '*'n个重复的向量格式化为形式为k ^ n * 的字符串。这个默认的短语是,我们将其传递给上面进一步描述的副词。:@{.,'^','*',~":@#/.
  • x rplc y是库函数替换字符。 y具有形式,a ; b并且ain中的string的每个实例均被x替换bx在进行操作之前将其弄平(即重塑以使其具有等级1),在此使用。此代码替换^1**的符合规定的输出格式。
  • }: y缩减y,即所有,但其最后一个项目。这用于删除结尾*

您不能通过使用节省很多工作__ q:吗?在线尝试!
2015年

@Adám确实,好主意!
FUZxxl

4

PHP,112

echo$n=$_GET[0],'=';$c=0;for($i=2;;){if($n%$i<1){$c++;$n/=$i;}else{if($c){echo"$i^$c*";}$c=0;if(++$i>$n)break;}}

118

echo $n=$_GET[0],'=';for($i=2;;){if(!($n%$i)){++$a[$i];$n/=$i;}else{if($a[$i])echo "$i^$a[$i]*";$i++;if($i>$n)break;}}

3

Python 119个字符

M=N=input()
i=1
s=""
while N>1:
 i+=1;c=0
 while N%i<1:c+=1;N/=i
 if c:s+=" * %d"%i+['','^%d'%c][c>1]
print M,'=',s[3:]

1
这是我第一次尝试,但实在是太慢了大素数,如4294967291.
基思·兰德尔

@Keith该问题最多允许10分钟。在最坏的情况下,这会花费超过10分钟的时间吗?
fR0DDY 2011年

2
这个数字在我的机器上花费了32分钟。
基思·兰德尔

3

JavaScript中,124 122 119

for(s='',i=2,o=p=prompt();i<o;i++){for(n=0;!(p%i);n++)p/=i;n?s+=i+(n-1?'^'+n:'')+'*':0}alert(s.substring(0,s.length-1))

3

Perl,78岁

use ntheory":all";say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp(shift)

它使用Perl 5.14的s /// r功能消除^ 1。81个字符可循环运行:

perl -Mntheory=:all -nE 'chomp;say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp($_);'

如果愿意,您可以省略空格。这将节省两个字符。不错的解决方案!
2014年

2

PHP,236个字符

$f[$n=$c=$argv[1]]++;echo"$n=";while($c){$c=0;foreach($f as$k=>$n)for($r=~~($k/2);$r>1;$r--){if($k%$r==0){unset($f[$k]);$f[$r]++;$f[$k/$r]++;$c=1;break;}}}foreach($f as$k=>$n)if(--$n)$f[$k]="$k^".++$n;else$f[$k]=$k;echo implode("*",$f);

131784的输出:2 ^ 3 * 3 * 17 ^ 2 * 19

在测试时几秒钟内完成所有数字。

4294967296=2^32
Time: 0.000168

从来没有指定输入,所以我选择使用命令行参数来调用它。

php factorize.php 4294967296

2

Scala 374:

def f(i:Int,c:Int=2):List[Int]=if(i==c)List(i)else 
if(i%c==0)c::f(i/c,c)else f(i,c+1)
val r=f(readInt)
class A(val v:Int,val c:Int,val l:List[(Int,Int)])
def g(a:A,i:Int)=if(a.v==i)new A(a.v,a.c+1,a.l)else new A(i,1,(a.v,a.c)::a.l)
val a=(new A(r.head,1,Nil:List[(Int,Int)])/:(r.tail:+0))((a,i)=>g(a,i))
a.l.map(p=>if(p._2==1)p._1 else p._1+"^"+p._2).mkString("", "*", "")

松散:

def factorize (i: Int, c: Int = 2) : List [Int] = {
  if (i == c) List (i) else 
    if (i % c == 0) c :: f (i/c, c) else 
      f (i, c+1)
}
val r = factorize (readInt)
class A (val value: Int, val count: Int, val list: List [(Int, Int)])
def g (a: A, i: Int) = 
  if (a.value == i) 
    new A (a.value, a.count + 1, a.list) else 
    new A (i, 1, (a.value, a.count) :: a.list)
val a = (new A (r.head, 1, Nil: List[(Int,Int)]) /: (r.tail :+ 0)) ((a, i) => g (a, i))
a.l.map (p => if (p._2 == 1) p._1 else
  p._1 + "^" + p._2).mkString ("", "*", "")

2

J,74个字符

f=.3 :0
(":y),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:y
)

   f 131784
131784=2^3*3*17^2*19

64个字符,输入变量x

   x=.131784

   (":x),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:x
131784=2^3*3*17^2*19

如果设法将其转换为默认定义,则可以避免转义所有引号。您也可以使用3 : 0定义。
FUZxxl 2015年

@FUZxxl我希望我可以在3 : 0版本中放入未转义的字符串,但由于某种原因它不起作用。我可能稍后再尝试默认。这是我尝试的3:0:pastebin.com/rmTVAk4j
randomra

它应该工作。我不明白为什么。您是否按照您的名字命名y
FUZxxl 2015年

@FUZxxl这是我尝试的3:0:pastebin.com/rmTVAk4j
randomra 2015年

您尝试的3:0与您提供的单线不完全匹配。它使用''而不是a:在一个地方。也许那是区别?
FUZxxl 2015年

2

爪哇10,109个 108字节(lambda函数)(非竞争OP上的请求)

n->{var r=n+"=";for(int i=1,f;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;return r;}

在线尝试。

Java 6+,181个字节(完整程序)

class M{public static void main(String[]a){long n=new Long(a[0]),i=1,f;String r=n+"=";for(;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;System.out.print(r);}}

在线尝试。

-1个字节感谢@ceilingcat

说明:

n->{                // Method with integer parameter and String return-type
  var r=n+"=";      //  Result-String, starting at the input with an appended "="
  for(int i=1,f;i++<n;
                    //  Loop in the range [2, n]
      r+=           //    After every iteration: append the following to the result-String:
        f<1?        //     If the factor `f` is 0:
         ""         //      Append nothing
        :           //     Else:
         (f<2?      //      If the factor `f` is 1:
           i        //       Append the current prime `i`
          :         //      Else:
           i+"^"+f) //       Append the current prime `i` with it's factor `f`
         +(n>1?     //      And if we're not done yet:
            "*"     //       Also append a "*"
           :        //      Else:
            ""))    //       Append nothing more
    for(f=0;        //   Reset the factor `f` to 0
        n%i<1;      //   Loop as long as `n` is divisible by `i`
      n/=i)         //    Divide `n` by `i`
      f++;          //    Increase the factor `f` by 1
  return r;}        //  Return the result-String

@ceilingcat谢谢!
凯文·克鲁伊森

在发布此任务后取消创建Java 10的资格。
FUZxxl

@FUZxxl我已将Java 10 lambda标记为不竞争,并添加了Java 6程序,该程序于2006年12月发布
凯文·克鲁伊森

好的,很酷。这对我行得通!
FUZxxl

2

Japt28 27 26字节

-1个字节,感谢Shaggy

+'=+Uk ü ®ÊÉ?ZÌ+'^+Zl:ZÃq*

试试吧


取消资格,因为您在发布此任务后创建了您的语言。
FUZxxl


发布挑战后,不允许返回。我认为在挑战发布后修改挑战规则是不公平的,因此在挑战之后发布的语言仍然是非法的。
FUZxxl

1
@FUZxxl您不必接受我的回答,但是无论如何我都可以回答。
奥利弗


1

Powershell,113 97字节

受到乔伊的 答案的启发。这很慢但是很短。

param($x)(2..$x|%{for(;!($x%$_)){$_
$x/=$_}}|group|%{$_.Name+"^"+$_.Count-replace'\^1$'})-join'*'

解释测试脚本:

$f = {

param($x)               # let $x stores a input number > 0
(2..$x|%{               # loop from 2 to initial input number
    for(;!($x%$_)){     # loop while remainder is 0
        $_              # push a current value to a pipe
        $x/=$_          # let $x is $x/$_ (new $x uses in for condition only)
    }
}|group|%{              # group all values
    $_.Name+"^"+$_.Count-replace'\^1$'  # format and remove last ^1
})-join'*'              # make string with *

}

&$f 2
&$f 126
&$f 129
&$f 86240
#&$f 7775460

输出:

2
2*3^2*7
3*43
2^5*5*7^2*11

1

果冻,16 个字节(根据OP的要求不竞争)

³”=³ÆFḟ€1j€”^j”*

我的第一个果冻答案之一,因此绝对可以打高尔夫球(特别是³”=³)。

在线尝试。

说明:

³                 # Push the first argument
 ”=               # Push string "="
   ³ÆF            # Get the prime factor-exponent pairs of the first argument
      ḟ€1         # Remove all 1s from each pair
         j€”^     # Join each pair by "^"
             j”*  # Join the pair of strings by "*"
                  # (implicitly join the entire 'stack' together)
                  # (which is output implicitly as result)

取消资格,因为您在发布此任务后创建了您的语言。
FUZxxl

@FUZxxl 自2017年中以来,不竞争已不在元数据中,除非挑战明确指出语言应早于发布时间。但是,如果您作为发布挑战的人选择不允许发布比您发布的挑战晚的语言,我将编辑答案以添加明确的语言(non-competing)。:)
凯文·克鲁伊森

我认为发布此挑战时已经就网站达成共识,应确定答案规则。其他所有内容(即在发布挑战后更改的规则)都是不公平的。请标记您的答案为非竞争性。
FUZxxl

@FUZxxl我已根据要求将我的答案标记为不竞争。
凯文·克鲁伊森

谢谢您的帮助。
FUZxxl

1

05AB1E22 20 字节(根据OP的请求不竞争)

ÐfsÓ0Køε1K'^ý}'*ý'=ý

-2个字节,感谢@Emigna

在线尝试。

说明:

Ð                # Triplicate the (implicit) input-integer
 f               # Pop and push all prime factors (without counting duplicates)
  s              # Swap to take the input again
   Ó             # Get all prime exponents
    0K           # Remove all 0s from the exponents list
      ø          # Zip it with the prime factors, creating pairs
       ε         # Map each pair to:
        1K       #  Remove all 1s from the pair
        '^ý     '#  And then join by "^"
       }'*ý     '# After the map: join the string/integers by "*"
           '=ý  '# And join the stack by "=" (with the input we triplicated at the start)
                 # (after which the result is output implicitly)

1K应该在循环中工作而不是`≠iy
Emigna

@Emigna Ah哈哈..我实际上是在刚发布的Jelly回答中这样做的。不知道为什么我在这里早些时候没有想到它。:)
凯文·克鲁伊森

取消资格,因为您在发布此任务后创建了您的语言。
FUZxxl,

1

APL(NARS),66个字符,132个字节

{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}

测试和评论:

  f←{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
  f 131784
131784=2^3 * 3 * 17^2 * 19
  f 2
2=2
  f (2*32)
4294967296=2^32

{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
k←π⍵      find the factors with repetition of ⍵ and assign that array to k example for 12 k is 2 2 3
v←∪       gets from k unique elements and put them in array v
+/¨{k=⍵}¨ for each element of v count how many time it appear in k (it is array exponents)
v,¨       make array of couples from element of v (factors unique) and the array above (exponents unique)
∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨ pretty print the array of couples factor exponent as array chars
3↓                                 but not the first 3 chars
(⍕⍵),'='  but print first the argument and '=' in char format

如果某人有很多时间使用这些原语,请对它们非常了解,对我来说,代码可能更清晰地注释...因此代码比注释更清晰,注释无用...


0

JavaScript的107

n=prompt()
s=n+'='
c=0
for(i=2;;){if(n%i<1){c++
n/=i}else{if(c)s+=i+'^'+c+'*'
c=0
if(++i>n)break}}
alert(s)

120

n=prompt()
o={2:0}
for(i=2,c=n;i<=c;)!(c%i)?++o[i]?c/=i:0:o[++i]=0
s=n+'='
for(i in o)s+=o[i]?i+'^'+o[i]+'*':''
alert(s)

1
具有后*在输出和打印指数即使是1
Ventero

无需投票。没有人说如果它是1则无法打印指数。此外,尾随*假定乘以1。如果有这么大的问题,我会解决。
zzzzBov 2011年

1
任务描述中的“以下格式”在很大程度上意味着1不应打印指数。不,这 *也是反对的。如果可以自由选择输出格式,那么炮轰到factor(1)将是最容易的一种。如果答案都解决相同的问题,则只能合理地比较答案。
Joey

3
我是这个任务的创建者,如果只有1个素数可以作为因数,则必须省略指数。
FUZxxl 2011年


0

PHP,93字节

<?=$n=$argn;for($i=2;$n>1;$k&&$p=print($p?"*":"=")."$i^$k",$i++)for($k=0;$n%$i<1;$n/=$i)$k++;

我可以使用PHP 5.5(或更高版本)来处理89个字节,但这将挑战推迟了2年以上:

<?=$n=$argn;for($i=2;$n>1;$k&&$p=print"=*"[$p]."$i^$k",$i++)for($k=0;$n%$i<1;$n/=$i)$k++;

与管道一起运行-nF在线尝试它们

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.