====== Séquences de brins d'ADN ====== L'[[http://fr.wikipedia.org/wiki/Acide_d%C3%A9soxyribonucl%C3%A9ique|ADN]] (acide désoxyribonucléique) est constitué d'une suite de nucléotides qui existent en quatre types différents (notés A, C, G et T), du nom des bases adénine (A), cytosine (C), guanine (G) et thymine (T). Les brins s'associent en double hélice par une reproduction assurant une correspondance par paires, A et T d'une part, G et C d'autre part. ===== Dénombrement de séquences possibles ===== ===== Énoncé ===== * Si on considère un ensemble de n bases, combien de brins différents est-il possible d'obtenir ? * Avec 1 A, 1 C, 1 G et 1 T * Avec 1 A, 1 C, 2 G et 2 T * Avec 2 A, 2 C, 2 G et 2 T * Avec 3 A, 3 C, 3 G et 3 T * Avec i A, i C, i G et i T (i étant grand) * Si on considère une synthèse artificielle d'un brin composé de n bases issue d'un grand réservoir comprenant un nombre équivalent de chacune des bases, quel est le nombre de brins possibles comprenant 4 bases, 8 bases, 12 bases, 4*i bases ? ===== Programme Python ===== #!/usr/bin/env python # -*- coding: UTF-8 -*- """ Petit programme destiné à calculer des nombres de séquences ADN possibles combien de brins différents est-il possible d'obtenir : Avec 1 A, 1 C, 1 G et 1 T Avec 2 A, 2 C, 2 G et 2 T Avec 3 A, 3 C, 3 G et 3 T Avec i A, i C, i G et i T (i étant grand) Variante : Si on considère une synthèse artificielle d'un brin composé de n bases issue d'un grand réservoir comprenant un nombre équivalent de chacune des bases, quel est le nombre de brins possibles comprenant 4 bases, 8 bases, 12 bases, 4*i bases ? Comparaisons de 2 variantes pour des petits nombres et en utilisant la formule de Striling pour des grands nombres """ from math import * def logfactstir(j): # approximation de Stirling pour le logarithme de la factorielle return j*log(j) - j + log(2.*pi*j)/2. n=101 # petits nombres for i in range(1,n): print(i,factorial(4*i)/factorial(i)**4, 4**(4*i)) # petits nombres, en log for i in range(1,n): print(i,log(factorial(4*i)/factorial(i)**4), log(4**(4*i))) # grands nombres # calcul suivant la formule de Stirling (http://fr.wikipedia.org/wiki/Formule_de_Stirling) # formule de Stirling : ln(j!) ~= j ln(j) - j + 1/2 ln(2πj) # approximation fréquente en thermodynb : ln(j!) ~= j ln(j) - j print(pi) for i in range(100,100*n,100): print(i,logfactstir(4*i)-4.*logfactstir(i), 4*i*log(4)) # très grands nombres print(pi) for i in range(10000,10000*n,10000): print(i,logfactstir(4*i)-4.*logfactstir(i), 4*i*log(4))