Divisores divisivos divisorios

17

Dado un entero positivo siempre se puede encontrar una tupla de enteros tal que k_1 \ cdot k_2 \ cdot ... \ cdot k_m = n y k_1 | k_2 \ text {,} k_2 | k_3 \ text {,} \ ldots \ text {,} k_ {m-1} | k_m. Aquí a | b significa que b es un múltiplo de a , digamos "a divide b". Si n> 1, todas las entradas k_i deben ser al menos 2 . Para n = 1 no tenemos ese factor y, por lo tanto, obtenemos una tupla vacía.n(k1,k2,...,km)ki2k1k2...km=n

k1|k2 , k2|k3 ,  , km1|km.
a|siban>1ki2n=1

En caso de que tenga curiosidad de dónde proviene esto: esta descomposición se conoce como descomposición de factor invariante en la teoría de números y se utiliza en la clasificación de grupos abelianos finitamente generados.

Desafío

Dado n salida a todas esas tuplas (k1,k2,...,km) para la n dada exactamente una vez, en el orden que desee. Se permiten los formatos de salida de estándar .

Ejemplos

  1: () (empty tuple)
  2: (2)
  3: (3)
  4: (2,2), (4)
  5: (5)
  6: (6)
  7: (7)
  8: (2,2,2), (2,4), (8)
  9: (3,3), (9)
 10: (10)
 11: (11)
 12: (2,6), (12)
108: (2,54), (3,3,12), (3,6,6), (3,36), (6,18), (108)

Relacionado: http://oeis.org/A000688 , Lista todas las particiones multiplicativas de n

falla
fuente
¿Podemos generar cada tupla en orden inverso? (por ejemplo 12,3,3)
Arnauld
1
@Arnauld Sí, creo que siempre que esté ordenado en orden ascendente o descendente ¡debería estar bien!
flawr
¿Podemos limitar la entrada a enteros> = 2? Si no, esto invalidaría algunas de las respuestas existentes?
Nick Kennedy el
1
No, las especificaciones dicen claramente que cualquier entero positivo se puede dar como entrada que incluye . Si lo cambio ahora, todos los que realmente cumplan con las especificaciones tendrían que cambiar su respuesta. n=1
flawr

Respuestas:

3

05AB1E , 13 bytes

Òœ€.œP€`êʒüÖP

Pruébalo en línea!

Ò                      # prime factorization of the input
 œ€.œ                  # all partitions
     P                 # product of each sublist
      €`               # flatten
        ê              # sorted uniquified
         ʒ             # filter by:
          üÖ           #  pairwise divisible-by (yields list of 0s or 1s)
            P          #  product (will be 1 iff the list is all 1s)
Mugriento
fuente
Buena forma de usar Òœ€.œPpara obtener las sublistas. De hecho, también tuve problemas para encontrar algo más corto ... Si solo hubiera un producto similar al Åœproducto pero en lugar de la suma. ;)
Kevin Cruijssen
Falla para n = 1 (ver comentarios en la pregunta)
Nick Kennedy
2

JavaScript (V8) ,  73  70 bytes

Prints las tuplas en orden descendente (km,km1,...,k1) .

f=(n,d=2,a=[])=>n>1?d>n||f(n,d+1,a,d%a[0]||f(n/d,d,[d,...a])):print(a)

Pruébalo en línea!

Comentado

f = (             // f is a recursive function taking:
  n,              //   n   = input
  d = 2,          //   d   = current divisor
  a = []          //   a[] = list of divisors
) =>              //
  n > 1 ?         // if n is greater than 1:
    d > n ||      //   unless d is greater than n,
    f(            //   do a recursive call with:
      n,          //     -> n unchanged
      d + 1,      //     -> d + 1
      a,          //     -> a[] unchanged
      d % a[0] || //     unless the previous divisor does not divide the current one,
      f(          //     do another recursive call with:
        n / d,    //       -> n / d
        d,        //       -> d unchanged
        [d, ...a] //       -> d preprended to a[]
      )           //     end of inner recursive call
    )             //   end of outer recursive call
  :               // else:
    print(a)      //   this is a valid list of divisors: print it
Arnauld
fuente
1

05AB1E , 17 15 14 bytes

ѦIиæʒPQ}êʒüÖP

Muy lento para casos de prueba más grandes.

-1 byte gracias a @Grimy .

Pruébalo en línea.

Explicación:

Ñ               # Get all divisors of the (implicit) input-integer
 ¦              # Remove the first value (the 1)
  Iи            # Repeat this list (flattened) the input amount of times
                #  i.e. with input 4 we now have [2,4,2,4,2,4,2,4]
    æ           # Take the powerset of this list
     ʒ  }       # Filter it by:
      PQ        #  Where the product is equal to the (implicit) input
         ê      # Then sort and uniquify the filtered lists
          ʒ     # And filter it further by:
           ü    #  Loop over each overlapping pair of values
            Ö   #   And check if the first value is divisible by the second value
             P  #  Check if this is truthy for all pairs

                # (after which the result is output implicitly)
Kevin Cruijssen
fuente
n=8
1
13 y más rápido . Parece que puede ser más corto aún.
Grimmy
1

JavaScript, 115 bytes

f=(n,a=[],i=1)=>{for(;i++<n;)n%i||(a=a.concat(f(n/i).filter(e=>!(e[0]%i)).map(e=>[i].concat(e))));return n>1?a:[a]}

Escribiré una explicación más tarde

Naruyoko
fuente
0

Japt , 22 bytes

â Åï c à f@¥XשXäv eÃâ

Intentalo

â Åï c à f@¥XשXäv eÃâ     :Implicit input of integer U
â                          :Divisors
  Å                        :Slice off the first element, removing the 1
   ï                       :Cartesian product
     c                     :Flatten
       à                   :Combinations
         f                 :Filter by
          @                :Passing each sub-array X through the following function
           ¥               :  Test U for equality with
            X×             :  X reduced by multiplication
              ©            :  Logical AND with
               Xä          :  Consecutive pairs of X
                 v         :  Reduced by divisibility
                   e       :  All truthy?
                    Ã      :End filter
                     â     :Deduplicate
Lanudo
fuente