utilizzando DeleteCases con CoprimeQ

Oct 19 2020

per prima cosa fammi mostrare quello che ho funzionato correttamente

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

ora vorrei automatizzare la cancellazione di una lista {a, b, c} che restituisce false da questo test. Probabilmente posso farlo con Do [] ma volevo imparare la programmazione funzionale nel modo giusto usando funzioni integrate e funzioni pure su una riga di codice.

Ho passato molto tempo cercando di seguire questo esempio per DeleteCases [] qui, ma sembra che richieda la creazione di una funzione personalizzata. inoltre non è perfettamente correlato al mio esempio perché in quel tutorial stanno confrontando due elenchi. Ho provato a capirlo ma mi è passato per la testa.

qui non funziona l'esempio n. 1

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

qui non funziona l'esempio n. 2

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

inoltre preferisco non usare la stenografia @@ @ / @@@. puoi vedere che uso la forma completa di Applica [] che è preferibile mentre sto ancora imparando. Posso convertire tra di loro se ho bisogno di pubblicare ciò che hai.

Risposte

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

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

entrambi danno

{{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}}

Anche tu usi

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

dopo aver letto e provato gli ottimi esempi forniti da kglr, ho trovato una soluzione basata su questa risposta che si adatta meglio alla mia scelta preferita di stile di sintassi.

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

Stavo facendo più errori. Stavo usando le permutazioni invece dei sottoinsiemi. è stato difficile trovare documentazione su @ ma l'ho trovata qui . non esattamente la migliore documentazione di wolfram per più di un argomento, ma mi ha fatto superare la mia incomprensione dell'esempio postato qui. questo è stato adattato da

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

noti tutti gli @ / @? __ /; è andato dopo che l'ho rielaborato per le mie esigenze.

dopo aver consolidato tutto in una singola riga di codice utilizzando funzioni pure, sono stato quindi in grado di creare una tabella. esempio:

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

che dà

{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}

Ho quindi trovato una corrispondenza in OEIS . con esempio di codice

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

puoi decidere chi ha il codice più pulito tra tutti gli esempi. grazie mille a kglr per avermi aiutato a superare quando ero bloccato.