L'objectif de ce travail est d'apprendre à manipuler les listes à l'aide de fonctionnelles.
Vous devez utiliser autant que possible les fonctions List.map, List.filter, List.flatten et autres fonctionnelles de listes.
Deux nombres entiers et , compris strictement entre et sont choisis. On communique à Sophie la somme , et à Philippe le produit , mais et sont soigneusement maintenu secret. S'en suit une curieuse conversation :
" Tu ne connais pas les valeurs de et ", proclame Sophie à Philippe.
"Maintenant, si !" , répond Philippe.
"Et maintenant, moi aussi" réplique finalement Sophie.
Que valent et ?
Le sujet de ce TP est de trouver une réponse à cette énigme. Les premières questions vont nous permettre de définir plusieurs outils mathématiques qui nous seront utiles. Seules les dernières questions sont axées sur la résolutions de l'énigme elle-même.
Question : itérateur de fonctions
Écrire une fonction récursive iter, telle que
où est répété fois dans le membre droit de l'équation.
Question : génération d'un intervalle
En déduire une fonction interval de type int -> int -> int list, telle que
Question : produit de deux listes
Écrire une fonction pairs prenant deux listes en arguments, et calculant la liste de toutes les paires obtenus en prenant un élément de chaque liste. Par exemple :
val pairs [1;2;3] ['a';'b'] : int * char list =
[(1,'a');(2,'a');(3,'a');(1,'b');(2,'b');(3,'b')]
Question : crible d'Ératosthène
On souhaite faire la liste de tous les nombres premiers inférieurs à 100 .
Écrire une fonction relatively_prime prenant un entier et une liste d'entiers en argument, et testant si est relativement premier avec tous les entiers de . Son type sera donc:
val relative_prime : int -> int list -> bool
En utilisant List.fold_left, en déduire une fonction primes, prenant un entier , et retournant la liste de tous les nombres premiers inférieurs à .
Question : factorisation d'un entier
Maintenant que nous avons tous les nombres premiers jusqu'à , nous pouvons trouver l'unique factorisation de n'importe quel entier inférieur à (et même en fait).
Écrire une fonction récursive valuation, qui prend deux entiers et , et calcule le plus grand tel que divise .
Écrire une fonction récursive power, pour le calcul de la puissance sur les entiers.
Utiliser valuation pour calculer la factorisation d'un entier . Le résultat devra être une liste de couple tel que . Par exemple:
# factorize ps 136;;
- : (int * int) list = [(2, 3); (17, 1)]
Ici, ps est la liste des nombres premiers à utiliser pour la factorisation.
Question : facteurs d'un entier
À partir de la décomposition en nombre premier d'un entier, on peut facilement générer une liste de ses facteurs. Donner d'abord une fonction qui, prenant deux entiers et , calcule la liste des pour . En déduire une fonction calculant la liste des facteurs d'un entier.
Question : décomposition valide
Dans le cadre de l'énigme, seules les décompositions d'un entier en deux facteurs , avec nous intéressent. Donner une fonction valid_factorisations calculant toutes les décompositions valides (en ce sens) pour un entier quelconque. Écrire un fonction calculant le nombre de décomposition valide de .
Question : restreindre le choix de
Dans l'énigme, Sophie peut déduire de que Philippe ne connait pas la décomposition de en . Donc, pour toute paire avec , admet au moins deux décompositions. Testez toutes les valeurs possibles pour (de 4 à 198), et garderez celles pour lesquelles la propriété est vrai. Vous devriez obtenir une liste d'une dizaine de valeurs possibles pour .
En déduire une liste de paires possibles, avec .
Question : prendre en compte la remarque de Philippe
Philippe en déduit lui aussi que prend un de cette dizaine de valeurs. Puisqu'il en déduit , toutes les décompositions valides de autre que ont une somme n'appartenant pas à la liste des valeurs encore possible pour .
Pour toutes les paires potentielles, calculer les décompositions valides de . Garder seulement les paires qui n'admettent qu'une seule décomposition valide dont la somme est possible.
Question : Trouver et :
Enfin, Sophie trouve et . Il doit donc y avoir une paire possible dont la somme est unique parmi toutes les possibilités restantes, c'est la solution. Quel est cette solution ?