Trouver la taille du plus petit sous-ensemble avec GCD = 1


10

Il s'agit d'un problème de la session de pratique du Polish Collegiate Programming Contest 2012 . Bien que je puisse trouver les solutions pour le concours principal, je n'arrive pas à trouver la solution à ce problème n'importe où.

Le problème est le suivant: étant donné un ensemble de entiers positifs distincts ne dépassant pas 10 9 , trouvez la taille m du plus petit sous-ensemble qui n'a pas de diviseur commun autre que 1. N est au plus 500, et une solution peut être supposée exister.N109mN

J'ai réussi à montrer que . Mon raisonnement est le suivant: supposons qu'il existe un sous-ensemble minimal de taille S | S | = 10 , avec gcd = 1. Alors tous les 9 sous-ensembles de S doivent avoir gcd> 1. Il y a exactement 10 de ces sous-ensembles, et leurs gcd doivent être coprime par paire. Que ces pgcd soient 1 < g 1 < g 2 < . . . < g 10 , où gcd ( g i , g j ) = 1 , pour i m9S|S|=10S1<g1<g2<...<g10gcd(gi,gj)=1 . Alors le nombre maximum dans S est g 2 g 3 . . . g 10 . Mais g 2 g 3 . . . g 103 × 5 × 7 × 11 × . . . × 29 = 3234846615 > 10 9 , une contradiction.ijSg2g3...g10g2g3...g103×5×7×11×...×29=3234846615>109

Cependant, même avec cela, une force brute simple est encore trop lente. Quelqu'un a-t-il d'autres idées?


Pourquoi ne peut-on pas ? g2=2
vonbrand

. g 1 ne peut pas être 1, car 9 sous-ensembles ne peuvent pas avoir un pgcd de 1.g2>g12g1
Wakaka

Réponses:


1

Ce problème est équivalent au suivant, et il est trivial de construire une réduction dans les deux sens.

Étant donné une liste de vecteurs de bits, trouvez le nombre minimum d'entre eux de telle sorte que andtous résultent du vecteur de bit. ( )0()

Ensuite, nous montrons que la couverture d'ensemble est réduite à . Par ensemble de couvertures, je veux dire étant donné une liste d'ensembles S 1 , , S k , trouver le nombre minimum d'ensembles qui couvre leur union.()S1,,Sk

Nous ordonnons que les éléments des ensembles soient . Soit f ( S ) = ( 1 - χ a 1 ( S ) , , 1 - χ a n ( S ) ) , où χ x ( S ) = 1 si x S , 0 sinon. Notez que cette fonction est une bijection donc elle a un inverse.a1,,anf(S)=(1χa1(S),,1χan(S))χx(S)=1xS

Maintenant, si nous résolvons sur f ( S 1 ) , , f ( S k ) , et que les solutions sont { f ( S b 1 ) , , f ( S b m ) } , alors { f - 1 ( S b 1 ) , , f - 1 ( S b m ) }()f(S1),,f(Sk){f(Sb1),,f(Sbm)}{f1(Sb1),,f1(Sbm)} est la solution pour définir la couverture.

Ainsi, je pense que ce problème teste sa capacité à tailler l'espace de recherche.


Comment trouvez-vous la couverture minimale des sommets?
Yuval Filmus

oh nvm cette solution, il est à la place.
Chao Xu

1
C'est vrai, mais je pense que nous pouvons peut-être exploiter certaines propriétés de ce cas particulier. Par exemple, dans ce cas, les ensembles sont tous très énormes, avec des tailles non inférieures à . En fait, si les nombres dans les ensembles sont tous petits, leurs tailles seraient encore plus grandes. De plus, nous pouvons certainement trouver 9 ensembles qui couvrent tout. Quoi qu'il en soit, comment proposez-vous que je taille l'espace de recherche? n9
Wakaka

Je ne vois pas comment le problème (*) est équivalent à celui donné dans la question. D'une part, le problème donné dans la question a la promesse que tous les entiers seront , ce qui correspond à une garantie sur les poids des vecteurs de bits qui n'apparaissent pas dans le problème (*). 109
DW

1

Il est possible de résoudre ce problème de manière relativement efficace en calculant tous les gcd par paire, en supprimant les doublons, puis en répétant. C'est le fait de supprimer les doublons avant de récurer qui le rend efficace.

S,T

ST={gcd(s,t):sS,tT}.

|ST||S|×|T||ST|109STST|S|×|T|

S1S2=S1S1S3=S1S2S4=S1S3k1Sk1Sk1k. Si vous souhaitez également générer un exemple concret d'un tel sous-ensemble, en conservant des pointeurs en arrière, vous pouvez facilement reconstruire un tel ensemble.

109500×(|S1|+|S2|+)

k1SkxSiS1xiS1,S2,S3,S4,,S9S1,S2,S4,S8,S9S2=S1S1S4=S2S2S8=S4S4S9=S1×S8k[1,2,4,8,9]1Skk1Sk11Sk1Sk

xSkSi,Sjx

[1,2,4,8,9]Sk

Si


Je crois que la recherche binaire n'est pas nécessaire; vous pouvez stocker le nombre d'éléments avec chaque gcd et le régler sur la somme minimale de paires lors de chaque doublage.
KWillets

Grand point, @KWillets! Merci pour cette belle idée! Je l'ai intégré à ma réponse.
DW

0

109

ai=p1ni1p2ni2Pi
PiainijP

(1,1)(1,0)(1,0)(0,0)

1
p3401 pi500 PiAppBAp|ApB|1NP-complet, mais il peut y avoir des implémentations assez rapides pour cette taille.
polkjh

Pourriez-vous me diriger vers certaines implémentations qui pourraient fonctionner? Jusqu'à présent, je ne trouve que des algorithmes d'approximation. Merci!
Wakaka

Ce document d'enquête examine à la fois les solutions approximatives et exactes. Et lorsque vous répondez à un commentaire, veuillez ajouter @ nom-de-personne au commentaire. Il enverra une notification à cette personne. Sinon, ils ne connaîtront peut-être même pas votre commentaire.
polkjh

-1

Si vous pouvez trouver un sous-ensemble avec gcd (S) = 1, alors je peux toujours supprimer les éléments redondants du sous-ensemble jusqu'à ce qu'il ne reste que 2 éléments, qui ont gcd (S) = 1. Par conséquent, je peux affirmer que soit le plus petit le sous-ensemble contiendra 2 éléments ou il n'existera pas.

Maintenant, nous utilisons la récursivité pour résoudre ce problème. Divisons le tableau de nombres en 2 parties, une avec n-1 éléments et une avec 1 élément (dernier élément). Soit les 2 nombres seront dans les n-1 premiers éléments, soit un élément sera présent à partir de la 1ère partie appariée avec le dernier élément. Par conséquent, nous sommes en mesure de résoudre ce problème en

T (n) = temps T (n-1) + O (n). ce qui signifie T (n) = O (n ^ 2).


4
gcd(6,10,15)=1
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.