最大互素数分解


14

定义

  • 如果两个数字的唯一正公约数是,则它们是互质的1
  • 如果该列表中的每对数字互为互素,则该数字互斥互质
  • 数字的因式分解n是其乘积为的数字列表n

任务

给定一个正数n,输出n不包含的最大长度的互互素因式分解1

对于n=60,答案是[3,4,5],因为3*4*5=60没有其他互互素因式分解的1长度大于或等于3分解的长度。

规则与自由

  • 您可以使用任何合理的输入/输出格式。
  • 输出列表中的条目无需排序。

测试用例

n   output
1   []
2   [2]
3   [3]
4   [4]
5   [5]
6   [2, 3]
7   [7]
8   [8]
9   [9]
10  [2, 5]
11  [11]
12  [3, 4]
13  [13]
14  [2, 7]
15  [3, 5]
16  [16]
17  [17]
18  [2, 9]
19  [19]
20  [4, 5]
21  [3, 7]
22  [2, 11]
23  [23]
24  [3, 8]
25  [25]
26  [2, 13]
27  [27]
28  [4, 7]
29  [29]
30  [2, 3, 5]
31  [31]
32  [32]
33  [3, 11]
34  [2, 17]
35  [5, 7]
36  [4, 9]
37  [37]
38  [2, 19]
39  [3, 13]
40  [5, 8]
41  [41]
42  [2, 3, 7]
43  [43]
44  [4, 11]
45  [5, 9]
46  [2, 23]
47  [47]
48  [3, 16]
49  [49]
50  [2, 25]
51  [3, 17]
52  [4, 13]
53  [53]
54  [2, 27]
55  [5, 11]
56  [7, 8]
57  [3, 19]
58  [2, 29]
59  [59]
60  [3, 4, 5]
61  [61]
62  [2, 31]
63  [7, 9]
64  [64]
65  [5, 13]
66  [2, 3, 11]
67  [67]
68  [4, 17]
69  [3, 23]
70  [2, 5, 7]
71  [71]
72  [8, 9]
73  [73]
74  [2, 37]
75  [3, 25]
76  [4, 19]
77  [7, 11]
78  [2, 3, 13]
79  [79]
80  [5, 16]
81  [81]
82  [2, 41]
83  [83]
84  [3, 4, 7]
85  [5, 17]
86  [2, 43]
87  [3, 29]
88  [8, 11]
89  [89]
90  [2, 5, 9]
91  [7, 13]
92  [4, 23]
93  [3, 31]
94  [2, 47]
95  [5, 19]
96  [3, 32]
97  [97]
98  [2, 49]
99  [9, 11]

计分

这是。以字节为单位的最短答案将获胜。




后续挑战更加艰巨:结果列表中仅相邻对需要互质。
马丁·恩德

4
这仅仅是分解成主要力量的因素吗?
圣保罗Ebermann

1
@PaŭloEbermann是的。
Leaky Nun

Answers:




5

05AB1E3 5 字节

+2个字节可修复的边缘情况1。感谢赖利提供的补丁程序(以及测试套件,我的05ab1e不够坚固!)

ÒγP1K

在线测试套件

怎么样?

Ò     - prime factorisation, with duplicates
 γ    - split into chunks of consecutive equal elements
  P   - product of each list
   1  - literal one
    K - removed instances of top from previous
      - implicitly display top of stack

@Adnan是“字节”的最佳链接,还是某处有格式化的代码页?
乔纳森·艾伦

是的,有一个代码页显示所有字节。
阿德南(Adnan)

1
哦,我怎么会想念> _ <非常感谢:)
乔纳森·艾伦

不适用于1
Leaky Nun

@LeakyNun在帮助下解决了问题:)
乔纳森·艾伦


3

哈斯克尔,51个字节

(2#) 是一个匿名函数,接受一个整数并返回一个列表。

用作(2#) 99

m#n|m>n=[]|x<-gcd(m^n)n=[x|x>1]++(m+1)#div n x
(2#)

在线尝试!

受到力量技巧的启发,一些人在最近的squarefree数字挑战中使用了这种技巧

  • m#n产生因子n,从m
  • 如果m>n停止,则表明已经找到了所有因素。
  • x=gcd(m^n)nn所有因素中最大的因素m。请注意,因为m先测试较小的,1否则除非m是素数。
  • x如果结果列表不为1,则将其包括在结果列表中,然后使用下一个m除以n进行递归x。请注意,x并且div n x不能具有共同因素。
  • (2#)取一个数并开始从中找到它的因素2

3

MATL,7个字节

&YF^1X-

在线尝试!验证所有测试用例

说明

以输入80 为例。

&YF    % Implicit input. Push array of unique prime factors and array of exponents
       % STACK: [2 3 5], [4 0 1]
^      % Power, element-wise
       % STACK: [16 1 5]
1      % Push 1
       % STACK: [16 1 5], 1
X-     % Set difference, keeping order. Implicitly display
       % STACK: [16 5]

编辑(2017年6月9日):YF版本20.1.0中修改了两个输出:非因数素数和它们的(零)指数被跳过。这不会影响上面的代码,该代码无需任何更改即可工作(但1X-可以删除)。


我认为更改方式1X-在新版本中是多余的...而且,这看起来像是设置差异,而不是与我交叉。
与Orjan约翰森

@ØrjanJohansen都正确。谢谢!
Luis Mendo

2

果冻,5 个字节

ÆF*/€

在线测试套件

怎么样?

ÆF*/€ - Main link: n
ÆF    - prime factors as [prime, exponent] pairs
   /€ - reduce €ach with:
  *   - exponentiation

在试图发现将配合与你(不幸的是失败的)另一种方法,一个备用的6字节的解决方案:ÆfŒgZP。它具有相同数量的令牌,但有太多的两字节原子;)
HyperNeutrino

...就像我删除的05ab1e条目一样,它返回1的输入1是不允许的(执行空产品的效果)。
乔纳森·艾伦

:(好吧,哎呀,忽略了那个。达恩。:P
HyperNeutrino

2

爱丽丝,10字节

Ifw.n$@EOK

在线尝试!

不幸的是,这里采用的代码点作为整数I / O再次。测试用例在TIO链路是输入191808,其分解成648137。请注意,此解决方案按从最大到最小素数的顺序打印素数幂,因此我们得到了输出%Q@

为了方便起见,这是一个具有十进制I / O的16字节解决方案,它使用相同的核心算法:

/O/\K
\i>fw.n$@E

在线尝试!

说明

作为其他答案,这会将输入分解为素幂。

I      Read a code point as input.
f      Compute its prime factorisation a prime/exponent pairs and push them
       to the stack in order from smallest to largest prime.
w      Remember the current IP position on the return address stack. This
       starts a loop.
  .      Duplicate the current exponent. This will be zero once all primes
         have been processed.
  n$@    Terminate the program if this was zero.
  E      Raise the prime to its corresponding power.
  O      Output the result as a character.
K      Return to the w to run the next loop iteration.

2

mathematica 46字节

#[[1]]^#[[2]]&/@If[#==1,#={},FactorInteger@#]&

在线尝试!


很好的答案,但是对于某些测试用例,它给出的输出略有不正确。目前,您的代码已输出, {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ...但应{}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ...改为输出。
凯文·克鲁伊森

我想我固定它
J42161217

似乎确实可以在TIO中工作。+1哦,欢迎来到PPCG,我在这里很新。您可能已经看过了,但是,如果没有,那么通读Mathematica的高尔夫球技巧可能会很有趣。入住愉快!:)
凯文·克鲁伊森

1
如果您发现自己访问的#不仅仅是#自身的组件,则可以使用Apply@@@)而不是Map/@)节省很多字节:#^#2&@@@If...
Martin Ender

1

PHP,62字节

打印一个以质数为键的关联数组,以及质数用作值的频率,而没有输入内容 1

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!++$r[$i];print_r($r);

在线尝试!

输出为 60

Array
(
    [2] => 2
    [3] => 1
    [5] => 1
)

PHP,82字节

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);print_r($r);

在线尝试!

1如果希望改为空数组,则不打印任何内容作为输入,而排序数组则要更长一些

for($r=[],$i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);sort($r);print_r($r);

1

实际上,6个字节

w⌠iⁿ⌡M

在线尝试!

说明:

w⌠iⁿ⌡M
w       factor into [prime, exponent] pairs
 ⌠iⁿ⌡M  for each pair:
  i       flatten
   ⁿ      prime**exponent


0

最小ML,47字节

涉及素数分解的挑战在这里过多地代表了,因此,我们所有人都被迫在标准库中进行素分解。

fun n->map(fun p->ipow(fst p)(snd p))(factor n)

请注意,miniml中的“ mini”是指功能集的大小,而不是其中编写的源代码的大小。


0

Ruby,61个字节

require 'prime'
->n{(2..n).select{|e|n/e.to_f%1==0&&e.prime?}}

看完6-7字节的解决方案后,我真的很失望-))


0

Mathematica,24个字节

Power@@@FactorInteger@#&

太糟糕了@@@*不是一回事。另外,我想/@*@@*和实际上的变化@@@/@@//@@@@或什么,并添加无限的家庭//@///@...

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.