Fatoração máxima co-prime mutuamente


14

Definições

  • Dois números são co-primos se o único divisor comum positivo for 1.
  • Uma lista de números é co-prime mutuamente se cada par de números nessa lista for co-prime entre si.
  • Uma fatoração de número né uma lista de números cujo produto é n.

Tarefa

Dado um número positivo n, produza a fatoração mutuamente co-primária ncom o comprimento máximo que não inclui 1.

Exemplo

Pois n=60, a resposta é [3,4,5]: porque 3*4*5=60e nenhuma outra fatoração mutuamente co-principal sem 1comprimento maior ou igual ao 3comprimento da fatoração.

Regras e liberdades

  • Você pode usar qualquer formato razoável de entrada / saída.
  • As entradas na lista de saída não precisam ser classificadas.

Casos de teste

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]

Pontuação

Isso é . A resposta mais curta em bytes vence.




Desafio de acompanhamento mais difícil: somente pares adjacentes na lista resultante precisam ser co-primos.
Martin Ender

4
Isso é apenas uma fatoração em potências primárias?
Paŭlo Ebermann

1
@ PaŭloEbermann sim, é.
Freira vazando

Respostas:



9

Braquilog , 4 bytes

ḋḅ×ᵐ

Experimente online!

Explicação

       # output is the list of
  ×ᵐ   # products of each
 ḅ     # block of consecutive equal elements
ḋ      # of the prime factors
       # of the input

2
Parabéns pela sua primeira resposta Brachylog! ... pelo menos eu acho?
Fatalize

1
@Fatalize: Meu segundo eu acho. Eu já tinha esse antes. Definitivamente o meu mais curto embora :)
Emigna

5

05AB1E , 3 5 bytes

+2 bytes para corrigir o caso de borda de 1. Graças a Riley pelo patch (e pela suíte de testes, meu 05ab1e não é tão forte!)

ÒγP1K

Conjunto de testes em Experimente online!

Quão?

Ò     - 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 é o melhor link para "bytes" ou existe uma página de código formatada em algum lugar?
Jonathan Allan

Sim, existe uma página de código que exibe todos os bytes.
11403 Adnan

1
Oh, Como eu perca> _ <Graças sempre muito :)
Jonathan Allan

Não funciona para 1.
Leaky Nun

@LeakyNun fixa-se com a ajuda :)
Jonathan Allan


3

Haskell , 51 bytes

(2#) é uma função anônima que pega um número inteiro e retorna uma lista.

Use como (2#) 99.

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

Experimente online!

Inspirado pelo truque de poder que algumas pessoas usaram no recente desafio de número sem quadrados .

  • m#ngera fatores de n, começando com m.
  • Se m>npararmos, concluímos que já encontramos todos os fatores.
  • x=gcd(m^n)né o maior fator ncujos fatores principais estão presentes m. Observe que, como os menores msão testados primeiro, isso será a 1menos que mseja primo.
  • Incluímos xna lista resultante, se não for 1, e depois recuamos com a próxima m, dividindo npor x. Observe que xe div n xnão pode ter fatores comuns.
  • (2#)pega um número e começa a encontrar seus fatores a partir de 2.

3

MATL , 7 bytes

&YF^1X-

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere a entrada 80 como um exemplo.

&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]

EDIT (9 de junho de 2017): YFcom duas saídas foi modificado no release 20.1.0 : números primos sem fator e seus expoentes (zero) são ignorados. Isso não afeta o código acima, que funciona sem exigir alterações (mas 1X-pode ser removido).


Presumo que os meios de alteração 1X-sejam redundantes no novo lançamento ... também, isso parece uma diferença definida, em vez de uma interseção para mim.
Ørjan Johansen

@ ØrjanJohansen Correto em ambos. Obrigado!
Luis Mendo

2

Gelatina , 5 bytes

ÆF*/€

Conjunto de testes em Experimente online!

Quão?

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

Uma solução de 6 bytes alternativa na tentativa de encontrar um outro método que amarrar com o seu (infelizmente não): ÆfŒgZP. Tem o mesmo número de fichas, mas também muitas átomos de dois bytes;)
HyperNeutrino

... e, como a minha entrada 05ab1e excluída, ela retorna 1para uma entrada 1que não é permitida (o efeito de executar um produto vazio).
Jonathan Allan

:( Bem, whoops, ignorou isso. Droga.: P
HyperNeutrino

2

Alice , 10 bytes

Ifw.n$@EOK

Experimente online!

Infelizmente, isso usa pontos de código como E / S inteira novamente . O caso de teste no link TIO é a entrada 191808 que se decompõe em 64 , 81 e 37 . Observe que esta solução imprime as potências primárias na ordem da maior para a menor, para obtermos a saída %Q@.

Por conveniência, aqui está uma solução de 16 bytes com E / S decimal que usa o mesmo algoritmo principal:

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

Experimente online!

Explicação

Como as outras respostas, isso decompõe a entrada em potências primárias.

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 bytes

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

Experimente online!


Boa resposta, mas está dando uma saída ligeiramente incorreta para alguns dos casos de teste. Atualmente, seu código é exibido, {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ... mas deve ser exibido {}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ....
Kevin Cruijssen

Acho que fixa-lo
J42161217

Parece funcionar de fato no TIO . +1 Bem-vindo ao PPCG, vejo que você é relativamente novo aqui. Você provavelmente já viu, mas se não, as dicas para jogar golfe no Mathematica podem ser interessantes de ler. Aproveite sua estadia! :)
Kevin Cruijssen

1
Se você está acessando os componentes de #mais de #si mesmo, você pode salvar um monte de bytes usando Apply( @@@) em vez de Map( /@):#^#2&@@@If...
Martin Ender

1

PHP, 62 bytes

imprime uma matriz associativa com o primo como chave e com que frequência o primo é usado como valor e nada para entrada 1

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

Experimente online!

Saída para 60

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

PHP, 82 bytes

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

Experimente online!

imprime nada para entrada 1se você deseja uma matriz vazia e uma matriz classificada será um pouco mais longa

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



0

miniML , 47 bytes

Os desafios que envolvem a fatoração primária são super-representados aqui, então todos somos tristemente forçados a ter a fatoração na biblioteca padrão.

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

Observe que o 'mini' em miniml se refere ao tamanho do conjunto de recursos, não ao tamanho do código-fonte escrito nele.


0

Ruby, 61 bytes

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

Estou realmente decepcionado depois de procurar soluções de 6 a 7 bytes -))


0

Mathematica, 24 bytes

Power@@@FactorInteger@#&

Pena que @@@*não é uma coisa. Além disso, eu gostaria /@*, @@*e, de fato, a mudança @@@para /@@, //@de @@@ou o que quer e adicione a família infinita de //@, ///@...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.