usando DeleteCases con CoprimeQ

Oct 19 2020

primero déjame mostrarte lo que tengo funcionando correctamente

f = Permutations[Range[5], {3}]
Riffle[f, Apply[CoprimeQ, f, {1}]]

ahora me gustaría automatizar la eliminación de una lista {a, b, c} que devuelve falso de esta prueba. Probablemente pueda hacerlo con Do [] pero quería aprender programación funcional de la manera correcta usando funciones integradas y función pura en una línea de código.

Pasé mucho tiempo tratando de seguir este ejemplo para DeleteCases [] aquí, pero parece que requiere construir una función personalizada. tampoco se correlaciona perfectamente con mi ejemplo porque en ese tutorial están comparando dos listas. Traté de entenderlo pero se me pasó por la cabeza.

aquí no funciona el ejemplo n. ° 1

f = Permutations[Range[5], {3}]
DeleteCases[f, CoprimeQ]

aquí no funciona el ejemplo # 2

f = Permutations[Range[5], {3}]
DeleteCases[f, (CoprimeQ[_x] == False) -> x]

también prefiero no utilizar la abreviatura @@ @ / @@@. puede ver que utilizo la forma completa de Apply [], que es preferible para mí mientras todavía estoy aprendiendo. Puedo convertir entre ellos si necesito publicar lo que tienes.

Respuestas

6 kglr Oct 19 2020 at 21:52
DeleteCases[{x__ /; Not@CoprimeQ[x]}]@f

DeleteCases[Except[_List?(Apply[CoprimeQ])]]@f

ambos dan

{{1, 2, 3}, {1, 2, 5}, {1, 3, 2}, {1, 3, 4}, {1, 3, 5}, {1, 4, 3}, {1, 4, 5},
{1, 5, 2}, {1, 5, 3}, {1, 5, 4}, {2, 1, 3}, {2, 1, 5}, {2, 3, 1}, {2, 3, 5}, 
{2, 5, 1}, {2, 5, 3},  {3, 1, 2}, {3, 1, 4}, {3, 1, 5}, {3, 2, 1}, {3, 2, 5}, 
{3, 4, 1}, {3, 4, 5}, {3, 5, 1},  {3, 5, 2}, {3, 5, 4}, {4, 1, 3}, {4, 1, 5}, 
{4, 3, 1}, {4, 3, 5}, {4, 5, 1}, {4, 5, 3}, {5, 1, 2}, {5, 1, 3}, {5, 1, 4}, 
{5, 2, 1}, {5, 2, 3}, {5, 3, 1}, {5, 3, 2}, {5, 3, 4}, {5, 4, 1}, {5, 4, 3}}

Tu tambien usas

Cases[{x__ /; CoprimeQ[x]}]@f

Cases[_List?(Apply[CoprimeQ])]@f

Select[Apply[CoprimeQ]]@f

Pick[f, Apply[CoprimeQ, f, 2]]
acacia Oct 19 2020 at 23:50

después de leer y probar los excelentes ejemplos proporcionados por kglr, encontré una solución basada en esta respuesta que se adapta mejor a mi elección preferida de estilo de sintaxis.

Select[Subsets[Range[5], {3}], Apply[CoprimeQ]]

Cometí varios errores. Estaba usando permutaciones en lugar de subconjuntos. Fue difícil encontrar documentación en @ pero la encontré aquí . no es exactamente la mejor documentación de wolfram para más de un argumento, pero me ayudó a superar mi malentendido del ejemplo publicado aquí. esto fue adaptado de

f = Permutations[Range[5], {3}]
Select[Apply[CoprimeQ]]@f

¿notas todas las @ / @? __ /; se ha ido después de que lo modifiqué para mis necesidades.

después de consolidar todo en una sola línea de código usando funciones puras, pude crear una tabla. ejemplo:

Table[
Length[Select[Subsets[Range[x], {3}], Apply[CoprimeQ]]], {x, 3, 100}
]

lo que da

{1, 2, 7, 8, 19, 25, 37, 42, 73, 79, 124, 138, 159, 183, 262, 277,
378, 405, 454, 491, 640, 668, 794, 850, 959 , 1016, 1257, 1285, 1562,
1668, 1805, 1905, 2088, 2150, 2545, 2673, 2866, 2968, 3457, 3522,
4063, 4228, 4431, 4620, 5269, 5385, 5936, 6106, 6453, 6684 , 7513,
7660, 8166, 8400, 8834, 9141, 10168, 10287, 11388, 11752, 12202,
12614, 13341, 13521, 14848, 15263, 15921, 16164, 17657, 17918, 19505,
20031, 20603, 21125, 22248 , 22509, 24364, 24799, 25796, 26434, 28493,
28761, 30057, 30766, 31830, 32476, 34843, 35115, 36728, 37513, 38734,
39577, 41208, 41665, 44470, 45192, 46424, 47086}

Luego encontré una coincidencia en OEIS . con ejemplo de código

a[n_] := Select[Subsets[Range[n], {3}], And @@ (GCD @@ # == 1 & /@ Subsets[#, {2}]) &] // Length;
a /@ Range[49]

puede decidir quién tiene el código más limpio de todos los ejemplos. muchas gracias a kglr por ayudarme cuando estaba atascado.