Difficulté sur des entiers listés

Olympiades mathématiques, énigmes et défis
ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Difficulté sur des entiers listés

par ejsnews » 10 Juin 2022, 16:07

Bonjour,

Je tourne en rond sur un problème qui parait simple, mais je ne trouve pas la solution.

Soit 2 fonctions :

f1(x)=
f2(x)=

A chaque fois que f1(x) est entier, je veux supprimer l'élément x dans la liste des entiers... donc je dois retirer 21, 22, 24... et pour f2(x) je dois retirer 18, 19, 25.

Au final je veux retirer 18, 19, 21, 22, 24, 25 de l'espace Z... et je voudrais donc une fonction liste d'entiers pas supprimés du genre :
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 23, 26...

Quelqu'un le sait-il ?
Le pire c'est que j'ai f3(x), f4(x)... mais meme sur les 2 premières fonctions je n'y arrive pas de facon fiable,

merci.
Modifié en dernier par ejsnews le 11 Juin 2022, 09:29, modifié 1 fois.



Shalom15
Membre Naturel
Messages: 29
Enregistré le: 08 Avr 2020, 22:48

Re: Difficulté sur des entiers listés

par Shalom15 » 10 Juin 2022, 18:14

Bonjour, je pense que ce que tu dois chercher c'est une epression générale des fonctions et . Et pour ca tu peux résourdre l'équation: avec un élément de N. tu trouves là sont les valeurs que tu va éliminer. Si tu as un soucis puisque les valeurs de x qu'on trouve ne sont pas toutes dans N alors tu pourras distinguer deux cas: le cas de pair () et le cas impair () ainsi pour toutes les valeurs de k dans N tu auras une valeur de x (dans N) en fonction de l'équation que tu choisiras

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 10 Juin 2022, 20:34

En fait la difficulté que j'ai n'est pas de trouver comment supprimer de Z les éléments de f1(x), mais de le faire en cumulant les effets de f1(x) avec ceux de f2(x).
Par exemple la fonction élimine les entiers de f1(x) et me donne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 25 26 28 29 30 32 33 34 35 37 38...
C'est ensuite sur cette séquence déjà réduite que je souhaite retirer les entiers issus de f2(x) et meme si je trouve la fonction correspondante à ce f2(x), je n'arrive pas à les associer toutes deux ensembles pour afin d'avoir une fonction capable ensuite de me retirer ces 18, 19, 25, 28, 40... à la séquence 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 25 26 28 29 30 32 33 34 35 37 38...
Modifié en dernier par ejsnews le 11 Juin 2022, 09:25, modifié 1 fois.

Shalom15
Membre Naturel
Messages: 29
Enregistré le: 08 Avr 2020, 22:48

Re: Difficulté sur des entiers listés

par Shalom15 » 10 Juin 2022, 20:49

Je ne pense pas que tu pourras trouver une fonction qui supprimera à la fois les valeurs entières de et Par contre tu peux regrouper les deux fonctions dans un système.

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 10 Juin 2022, 21:13

j'ai tout essayé dans tous les sens, meme ta suggestion, sans y parvenir. Je n'arrive pas à croire que ce soit impossible, je me dis plutôt que je ne sais pas faire.

Shalom15
Membre Naturel
Messages: 29
Enregistré le: 08 Avr 2020, 22:48

Re: Difficulté sur des entiers listés

par Shalom15 » 10 Juin 2022, 21:41

Je pense que j'ai du mal à saisir ton problème.

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 10 Juin 2022, 22:18

Je souhaite à partir du jumelage de 2 fonctions déduites de f1(x) et f2(x) obtenir une autre fonction qui me donnera directement la séquence 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 23 26 29 32 33 34 35 37 38 39 41...

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Difficulté sur des entiers listés

par lyceen95 » 10 Juin 2022, 22:18

Si je comprends bien, on est dans une question de programmation.
Comment fais-tu pour retirer les éléments de f1 ? Il y a trop de façons différentes pour qu'on se fasse une idée.
Quel langage utilises-tu ?

Shalom15
Membre Naturel
Messages: 29
Enregistré le: 08 Avr 2020, 22:48

Re: Difficulté sur des entiers listés

par Shalom15 » 10 Juin 2022, 22:38

ejsnews a écrit:Je souhaite à partir du jumelage de 2 fonctions déduites de f1(x) et f2(x) obtenir une autre fonction qui me donnera directement la séquence 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 23 26 29 32 33 34 35 37 38 39 41...

Pourquoi ne pas utiliser une condition?

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Difficulté sur des entiers listés

par lyceen95 » 10 Juin 2022, 22:41

En Python ( Python pour les nuls, je suis vraiment pas un pro) :

Code: Tout sélectionner
from math import trunc

def f1_generator (rang0 , int08, int167 ):
    for ii in rang0:
        i01= int08*ii - int167
        if i01 < 0 :
            yield ii
        else :
            i00 =  pow(i01 , 0.5 )
            i02 = trunc( i00 )
            if i02*i02 < i01 :
                yield ii
            #:else :
            #    print ( 'rejet :' , ii,  'step=', int08 )

# main
range_f1 =  f1_generator ( range(10000)  , 8, 167 )
range_f2 =  f1_generator ( range_f1   ,  16, 279 )
range_f3 =  f1_generator ( range_f2   ,  24, 391 )
for ii in range_f3:
    print(ii)


Ici, j'enchaine 3 fonctions de filtre, mais on peut en enchainer 30 ou 100 si on veut.

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 11 Juin 2022, 02:20

Oui, effectivement cet algorithme en Python fonctionne, meme si je ne le comprends pas tout à fait (la partie centrale est assez intéressante d'ailleurs, merci), mais bien que ce ne soit pas recommandé, j'utilise plutôt le basic pour mes algorithmes: "yield ii" ressemble à "return ii", mais on dirait que cela affecte une sorte de matrice invisible de nombres qui sera retournée ensuite en sortie de fonction.

Le problème pour moi surtout, c'est que cela travaille sur un range de nombres avec la boucle FOR et que cela fonctionne sans doute par élimination globale d'entiers sur le range pour lesquels (int08-int167<0) sans cibler un Rang spécifique. Si on veut un rang très élevé le calcul devient donc très long.

Sais-tu améliorer cette tache (?) pour que j'ai une fonction du type ;

f1_f2_f3(Rang)=x

Example f1_f2_f3(30)=41

sans un travail sur un range, sans avoir besoin de ratisser tous les rangs qui précèdent le Rang souhaité pour trouver l'entier correspondant.
Une sorte d'équation en gros qui serait rapide meme si je demande le Rang 12012344.

Merci pour ton aide

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Difficulté sur des entiers listés

par lyceen95 » 11 Juin 2022, 10:06

Yield correspond plus ou moins un return en effet.
Mais c'est plus amusant que ça.
J'ai mis en commentaire 2 lignes else: print(rejet...)
Si tu réactives ces 2 lignes tu vas voir un truc intéressant.

En fait, les 3 lignes f1=f1_generator() ... ne font rien, elle préparent le terrain. On peut mettre 100 Milliards comme valeur, le temps d'exécution est nul, parce que la ligne de fait rien.
C'est quand on dit for ii in range_f3 que ça se joue.
Cette ligne dit en gros : allo, l'outil f1_generator, renvoyez moi la 1ère ligne correcte... et
là , le 1er f1_generator fait appel au 2ème ... qui fait appel au 3ème générateur.

Si tu as réactivé les 2 lignes actuellement en commentaire, on voit que les ""fonctions"" f1_generateur travaillent en même temps. Les lignes éliminées par tel critère s'intercalent les unes entre les autres.
Un peu une matrice invisible, en effet.

Revenons à ta question.
Trouver directement le 30ème, nombre, ou le 12345678ème nombre.
Faut réfléchir beaucoup plus !
Et en Basic nécessairement ?

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 11 Juin 2022, 12:37

En basic, cela m'aiderait à mieux comprendre, car je ne connais pas du tout le Python (une grosse erreur vu que les programmeurs de Qbit quantiques vont travailler en Python).
J'ai activé les commentaires... c'est bizarre en effet... à cause de l'ordre dans lequel cela se déroule... on dirait que 3 matrices sont travaillées en parallèles. Je me demande si c'est une réalité.

J'ai tenté de retirer la boucle FOR pour voir sur un seul ii, mais j'ai un problème de syntaxe.

Par ailleurs n'utilise pas qui ne marche pas, mais plutot .

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Difficulté sur des entiers listés

par lyceen95 » 11 Juin 2022, 14:00

L'image d'une matrice est un peu vraie, mais un peu fausse.
Si on parle d'une matrice, on va avoir en basic quelque chose comme ça:
Code: Tout sélectionner
dim Matrice(100000) integer
for i =1 to 100000
   matrice(i)=i
end

Donc on va avoir une zone réservée en mémoire , éventuellement énorme, éventuellement tellement grande que ça va planter parce que la mémoire du PC est insuffisante.
Et on va avoir un temps incompressible pour initialiser cette matrice.

Là, on n'a pas cette zone mémoire.
On lui dit ; tant qu'il reste des trucs dans F3, envoie moi le suivant, et je vais effectuer Print(ii)
Et pour récupérer l'élément suivant de F3, il fait quoi, il va chercher dans F2 l'élément suivant, autant de fois que nécessaire si cet élément n'est pas compatible avec les règles de F3
Et pareil, F2 'sous-traite' à F1, et F1 ,lui, il va chercher à chaque fois l'entier suivant, entre 0 et 9999.

En gros. c'est à chaque fois 'envoie-moi le suivant'.
Bon... j'ai découvert récemment cette commande yield, elle m'amuse beaucoup, et du coup, je brode, je brode.

Revenons à nos moutons.
On cherche le nombre qui serait au rang 123456 si on listait tous les éléments.
Déjà, on sait que ce nombre sera un peu plus grand que 123456, en gros entre 124000 et 130000 ?
Si on a un seul critère, on sait dire :
- Testons 124000,
- si 124000*8-167 est un carré parfait, on arrête, on recommence avc l'entier suivant.
- et sinon, combien y a-t-il de nombres x entre 1 et 124000 tels que 8x-167 soit un carré parfait , et donc 124000 , il est au rang 123450 par exemple.
- et du coup, on recommence en testant 124006
Par tâtonnement, on va assez vite trouver la réponse.

Combien y a-t-il de nombres entre 1 et 124000 tels que 8x-167 soit un carré parfait, je me trompe peut-être, mais je pense que c'est 'simple'.

Si on a 2 contraintes ( ni 8x-167, ni 16x-279 ne doit être un carré parfait)
Ca revient à compter les x tels que 8x-167 est un carré parfait, puis compter les x tels que 16x-279 est un carré parfait... ça roule
Mais on a compté 2 fois les nombres x pour lesquels on a en même temps 8x-167 est un carré parfait et aussi 16x-279 est un carré parfait.
Sait-on facilement dire combien de nombres entre 1 et 124000 vérifient ces 2 propriétés ?
Faut réfléchir, ce sera l'objectif de l'après midi.

Si on sait faire ça, étendre à 3 ou plus devrait être du même registre.
La technique du crible de Poincaré va nous aider.

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 11 Juin 2022, 14:38

Un crible oui, qui fonce sur sa proie sans faire de faux pas, mais il est amusant que tu dises que c'est l'objectif de l'AM.
Es-tu toujours lycéen ?

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Difficulté sur des entiers listés

par lyceen95 » 11 Juin 2022, 23:07

Non, je ne suis plus lycéen, depuis quelques décennies.

Bilan de l'après midi. Un long footing, ça permet de réfléchir.
Pour 8x-167, compter combien d'entiers sont ont un carré de la forme 8x-167, ça marche, simple. Tous les entiers impairs ont un carré de la forme 8x-167, et du coup, c'est facile.
Mais déjà, pour 16x-279, c'est plus compliqué. La formule pour comptabiliser les carrés de la forme 16x-279 dans un intervalle semble assez tordue (Et pire encore pour 24x-359)
Et comme en plus , derrière, on va devoir calculer le nombre d'entiers dont le carré est à la fois de la forme 16x-279 et de la forme 24x-359, ça va devenir impossible.

Donc une solution, c'est la force brute. On veut le 12345678ème terme ? et bien on cherche tous les termes, en les comptant 1 par 1, jusqu'à arriver à 12345678.

Code: Tout sélectionner
from math import trunc

def f1_generator (rang0 , int08, int167 ):
    for ii in rang0:
        i01= int08*ii - int167
        if i01 < 0 :
            yield ii
        else :
            i00 =  pow(i01 , 0.5 )
            i02 = trunc( i00 )
            if i02*i02 < i01 :
                yield ii
            #:else :
            #    print ( 'rejet :' , ii,  'step=', int08 )

def cherche (i):
    iplus = trunc((i+20)*1.03)
    range_f1 =  f1_generator ( range(1, iplus)  , 8, 167 )
    range_f2 =  f1_generator ( range_f1   ,  16, 279 )
    range_f3 =  f1_generator ( range_f2   ,  24, 359 )
    k=0
    for ii in range_f2:
        k=k+1
        if k == i:
            return ii
           
# main
print( cherche( 12345678 ) )

Réponse : 12354164 en 5 ou 6 secondes, sur un PC assez quelconque.
Au pire, on adapte. On sait maintenant que le 12345678 ème entier convenable, c'est 12354164 ; on mémorise ça quelque part. Et si on doit chercher un nouveau nombre plus loin, on recherche à partir de 12354164 et non à partir de 1.

ejsnews
Messages: 8
Enregistré le: 10 Juin 2022, 15:49

Re: Difficulté sur des entiers listés

par ejsnews » 11 Juin 2022, 23:40

Le problème c'est que j'ai donné un rang au hasard, il pouvait etre 10000 ou 100 millions de fois plus grand... j'avais déjà de tels algorithmes en langage basic. J'ai tenté de réfléchir au crible de Poincaré, mais je n'ai pas trouvé d'intersection qui explique le décalage.
Ce n'est pas grave, je vais continuer d'y réfléchir patiemment. Merci pour tes efforts, bonne nuit.

 

Retourner vers ⚔ Défis et énigmes

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 19 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite