Petit souci de formule

Résolu/Fermé
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008 - 24 août 2007 à 19:26
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008 - 22 sept. 2007 à 00:08
Bonjour a tous,

Voila c'est mon premier message sur se site que je trouve genial merci a tout ceux qui y participe
Bon bref je vous ecrit car j'ai un petit souci je doit ecrire un programme qui calcul log10(x) et log2(x) jusque la rien de terrible

Seulement c'est un projet de maths et donc bien entendu pas question d'utiliser les methodes standard présente dans tout les languages


voici une copie du sujet :
--------------------------------------------------------------------------------------------------------------------------------------------
x désigne un reel strictement positif
1) Montrer que x = M.10^y avec M € [1; 10 [ et y € Z

puis que M^10 = M1.10^y1 avec M1 € [1;10[ et y1 € {0,1,2, ..., 9}

Déduire des résultats precedents un algorithme de calcul de log10(x)

Ecrire un programme qui calcule log10(x) lorsqu'on lui donne x
-------------------------------------------------------------------------------------------------------------------------------------------

J'ai vraiment besoin d'aide au moins pour montrer la premiere equation apres je pense que je saurais adapter

Merci davance

30 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
24 août 2007 à 23:50
Salut Lefleau

Si c'est juste une indication que tu veux:
Utilise le fait que ln(x) est congru à un unique réel m modulo ln(10) avec 0=< m < ln(10).

Si l'indication de suffit pas, dis moi...
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
25 août 2007 à 09:43
d'accord donc deja merci pour ta réponse et si j'ai bien compris
j'utilise ln(x)=m(ln(10)) mais ensuite est ce que je peux utilisé l'inverse de ln(x) et aussi est ce que c'est la meme que log(10) soit 10^x ?


et oui je suis un noob en math mais bon je me rattrape en programmation
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
25 août 2007 à 10:51
Non, non... c'est pas ça.

ln(x) est congru à un unique réel m modulo ln(10) avec 0=< m < ln(10) ça veut dire:
il existe un unique m € R et un unique n € Z tels que:
(1)0=< m < ln(10)
et
(2)ln(x) = m + n.ln(10)

En fait si tu connais pas ce tout petit résultat, ça prend pas 3 pages pour le démonter, il faut juste utiliser la partie entière:
Soit n la partie entière de ln(x)/ln(10).
Alors par définition de la partie entière on a:
n=< ln(x)/ln(10) < n+1
Notant m=ln(x) - n.ln(10) on vérifie facilement que m et n vérifient (1) et (2).

Pour la suite de ton problème tu passes à l'exponentielle.

Ensuite pour le truc avec M1 c'est la même chose, utilise la congruence de 10.ln(M) modulo ln(10).
Le fait que l'entier y1 est compris entre 0 et 9 découlera des inégalités que tu as sur M et M1.
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
25 août 2007 à 14:32
et bien la c'est parfait je te remercie beaucoup tu m'as bien débloqué encore une fois merci
je ne termine pas encore se sujet pour au cas ou j'aurais encore quelque questions mais sa devrait aller

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
25 août 2007 à 18:35
OK, pas de problème...
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
25 août 2007 à 19:12
Ah... autre chose...
J'ai pas montré l'unicité de m et n dans mon message (t'en parlais pas dans l'énoncé).
Si t'en as besoin tu le feras :-) ça prend 2 lignes...
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
26 août 2007 à 20:20
oui je te remercie je pense que sa je pourrai au moins le faire lol tu va pas faire tout mon devoir ^^
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
12 sept. 2007 à 15:22
Malheureusement je n'ai pas réussi a résoudre mon problème
Alors pour info
Les congruences on était abordé mais pas détaillé
alors comme je tourne en rond pour résoudre le problème pourrais tu me détailler le calcul pour la première question du sujet s'il te plait ?
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
12 sept. 2007 à 17:29
Rebonjour

Bon ben c'est pas trop évident de taper des trucs dans un post sans éditeur de texte. Le mieux c'est que tu récupères ce fichier.

S'il y a ds trucs que tu comprends pas dis-moi.
Bonne fin de journée.
PS : j'ai pas relu, il y a peut-être des erreurs...
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
12 sept. 2007 à 21:23
ok je comprend mieux maintenant la partie exponentiel je n'y arrivé pas du coup je bloqué bettement
je te remercie beaucoup j'ai plus qu'a bien le comprendre le complete et a l'ajouté a l'interface que je viens de finir
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
14 sept. 2007 à 22:49
Décidément j'ai encore une petite question
le but initial de cette démonstration était de dégager un algorithme pour la calcul de log10(x)
Donc la démonstration je l'ai comprise sa il n'y a pas de souci seulement je me retrouve bloqué par les deux inconnu M et y
si je fait apparaitre log10(x) sa donne sa

log10(x) = (ln M + ln 10^y) / ln 10

alors est ce que je part pas du tout de la bonne formule ? est ce que j'ai fait une erreur ?
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
15 sept. 2007 à 17:58
Salut Lefleau02

Là tout à coup je me rend compte que j'ai été un peu stupide de travailler avec le logarithme népérien pour ton problème. C'était carrément plus naturel avec le logarithme en base 10, plus simple et en plus t'aurais surement mieux vu d'où allait bien pouvoir venir ton algorithme.
Du coup prends plutôt ce fichier.

Pour ton algorithme, l'égalité que tu as écrite est juste (au passage oublie pas que log10 = ln/ln(10)) et je pense que c'est bien comme ça qu'il faut partir.
Tu as log10(x) = y + log10(M) avec 0 =< log10(M) < 1
Ensuite 10 log10(M) = y1 + log10(M1) avec 0 =< log10(M1) < 1
C'est-à-dire log10(M) = y1/10 + log10(M1)/10 avec 0 =< log10(M1)/10 < 1/10
Et donc log10(x) = y + y1/10 + log10(M1)/10 avec 0 =< log10(M1)/10 < 1/10

Et tu itères le procédé M1^10=M2.10^y2 avec 1 =< M2 < 10 et y2 € {0,1,2, ..., 9} .
Dans ce cas tu as log10(x) = y + y1/10 + y2/100 + log10(M2)/100 avec 0 =< log10(M2)/100 < 1/100.
Bis repetita...
Du coup tu vois que pour tout n, yn est la nième décimale de log10(x) car
log10(x) = y + y1/10 + ......... + yn/10^n + log10(Mn)/10^n avec 0 =< log10(Mn)/10^n < 1/10^n

Voilà...
Et tu arrêtes ton algorithme à la décimale que tu veux. C'est bon? Tu veux que je détailles un peu plus?
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
15 sept. 2007 à 18:05
je te remercie pour ta reponse je vais prendre le temps de bien regarder et de comprendre toutes tes explications et je te dirais si j'ai tout compris
en tout cas merci pour ta patience
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
15 sept. 2007 à 18:10
De rien, ça me dérange pas...
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
15 sept. 2007 à 18:13
Pour le fichier je viens de le parcourir et je pense avoir compris par contre je ne comprend pas comment tu passe de cette ligne
C'est-à-dire log10(M) = y1/10 + log10(M1)/10 avec 0 =< log10(M1)/10 < 1/10
a celle ci
Et donc log10(x) = y + y1/10 + log10(M1)/10 avec 0 =< log10(M1)/10 < 1/10
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
15 sept. 2007 à 18:49
En remplaçant log10(M) = y1/10 + log10(M1)/10 dans la ligne log10(x) = y + log10(M).
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
15 sept. 2007 à 21:03
donc au niveau programmation soit je fait une fonction recursive soit jutilise le logarithme népérien c'est sa ? j'ai bien compris ?
et une autre question comment déterminé M et y ? je teste toute les solution ?
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
16 sept. 2007 à 03:18
Euh ben non, en si je t'ai dit de pas oublier que log10 = ln/ln(10) dans le mesage 12 c'était parce que ta formule log10(x) = (ln M + ln 10^y) / ln 10 de ton message 11 se simplifiait en log10(x) = y + log10(M).

Pour ton algorithme je pense que tu dois te fixer un nombre de décimales au début (appelons le n) et tu fais une boucle jusqu'à ce que t'atteignes n en incrémentant à chaque boucle la valeur du log10 calculé:
premier passage : log10 = y
deuxième passage log10 = log10 + y1/10
troisième passage log10 = log10 +y2/100
etc...
et au final log10 = y + y1/10 + ..... + yn/10^n

Pour déterminer le M et le y il y a que la première fois que c'est un peu chiant.
En fait c'est facile de vérifier que y= inf { p ; x/10^p < 10 } (d'ailleurs si tu veux faire comme ça pour les 2 premières questions ça reste possible et ça te permet de faire le lien avec ton algorithme).

Pour le tout premier passage dans la boucle le mieux c'est de séparer le cas où x < 1 et le cas où x >= 1.

Si x < 1, tu pars de y=-1 et tu diminues alors y jusqu'à ce que x/10^y >= 10 et le bon y c'est celui qui vaut celui que tu viens de tester +1.

Si x >= 1, la première valeur de y (en partant de 0 et en augmentant) telle que x/10^y < 10 est la bonne.

Pour les boucles suivantes pas besoin de faire de disjonction de cas puisque tu as tout le temps Mn^10 > = 1. Tu pars de 0 et tu augmentes.

Voilà et je me permets d'apporter une toute petite modification à ce que j'ai dit au message 12:
""Du coup tu vois que pour tout n, yn est la nième décimale de log10(x)""
En fait c'est vrai si x >= 1, sinon c'est pas tout à fait ça...
0
lefleau02 Messages postés 26 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 4 juin 2008
16 sept. 2007 à 09:50
D'accord je comprend a peu pres pour determiner les variable
et pour ce qui est ce la programmation je devrai pouvoir faire un truc du genre

public static nDecimalCourante;


public static float log10X(int x, int nDecimalSouhaite)
{
             // definition des variable
            // Calcul du premier log
           // incrementation de nDecimal
          // test de nDecimalCourante Si nDecimalSouhaite!=nDecimalCourante on rappel log
}

0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
16 sept. 2007 à 15:54
C'est en C que tu le fais?
J'ai un peu oublié ce langage depuis le temps...
En Matlab ça donnerait un truc comme ça:
function[res]=log10app(x,n)
clear y; clear M; clear res;
res=0; M=0;
format long
if (x<=0 || n<0)
    res='Erreur';
else
    for k=0:n
        y=0;
        if k==0
            if x<1
                while x/10^(y-1)<10
                    y=y-1;
                end
            else
                while x/10^y>=10
                    y=y+1;
                end
            end
            M=x/10^y;
            res=y;
        else
            while M^10/10^y>=10
                y=y+1;
            end
            M=M^10/10^y;
            res=res+y/10^k;
        end
    end
end

Et pis après il y a la possibilité d'améliorer pour comparer le résultat avec la fonction log10 de Matlab, etc...

Il se peut que l'appellation "nieme décimale" pour l'arrêt de la boucle soit pas apprécié vu que c'est pas vraiment la "nieme décimale" quand x<1. Tu peux éventuellement dire "approximation à 10^(-n) près", ce sera peut-être mieux...
0