Techniques de dérivation d’un monôme (et plus généralement, un polynôme)

Cet article traite de techniques de dérivation d’un monôme (et plus généralement de somme de monômes qu’on appelle polynôme). La toute première partie (1 & 2) peuvent servir aux lycéens et aux étudiants (et pour tous les mathématiciens) qui me lisent pour retrouver la formule de dérivée de monôme. La dernière partie traite de la dérivation d’un polynôme quelconque et relève plus de la récréation mathématique qu’autre chose.

Lire la suite

Publicités

Dérivation arithmétique (partie 2)

Dans cet article, il est question d’approximer des réels par des rationnels et de calculer les dérivées arithmétiques. On étudiera le comportement de la suite des dérivées arithmétiques et on appliquera les différentes méthodes d’approximations sur des réels bien choisis.

DerivArithP2

[DerivArth] Dérivée arithmétique de fractions k/n sur l’intervalle [0;1]

Dans cet article, nous nous plaçons dans l’intervalle I = [0;1]. Sur XCas, nous avons déjà validé les programmes suivants qui permet de calculer les dérivées arithmétiques d’élément de \mathbb{N}, \mathbb{Z} et \mathbb{Q}.

derivarthN(n):={
local m,p,L,D,N,s;
L := ifactors(n)
si n == 0 ou n==1 alors
retourne(0)
sinon
s := 0;
D := []; N:=[];
tantque nops(L) <> 0 faire
D := [op(D),L(1)]
N := [op(N),L(2)]
pour k de 1 jusque 2 faire
L := tail(L)
fpour
ftantque
pour k de 1 jusque nops(D) faire
s := s + N(k)/D(k)
fpour
retourne(n*s)
fsi}:;

derivarthZ(a) := {si a <> 0 alors retourne(a*derivarthN(abs(a))/abs(a)) sinon retourne(0) fsi}:;

derivarthQ(a,b):= {
retourne((derivarthZ(a)*b-derivarthZ(b)*a)/b^2)
}:;

Ainsi, pour obtenir la dérivée arithmétique du nombre \frac{1}{9}, on tape sur XCas :

derivarthQ(1,9)

-2/27

Dans cet article, on fixe N \in \mathbb{N} et on s’intéresse aux suites (R_n)_{0 \le n \le N} définies par R_n = \frac{n}{N}. Comme 1 \le n \le N, R_n \in I.

Prenons N = 10. Voici les dérivées arithmétiques des termes de la suite (R_n).

seq(derivarthQ(k,10),k=0..10)

0,-7/100,-1/25,-11/100,3/25,-1/4,2/25,-39/100,16/25,-3/100,0

et la représentation graphique des termes de la suite :

GDAR10Sur ce graphique, on voit tout d’abord qu’il y a alternance des termes de la suite (6 termes négatifs, 2 termes nuls et 3 termes positifs).

Augmentons la valeur de N.

Cas où N = 50 :

GDAR50

Cas où N = 200

GDAR200

Cas où N = 1000

GDAR1000

Cas où N = 5000

GDAR5000

Cas où N = 20000

GDAR20000

On peut remarquer que les termes négatifs se comportent comme une fonction linéaire (comme attestent les graphiques pour N grand).

Le terme \frac{N-1}{N} pour N \to \infty semblent tendre vers l’infini.

[DerivArth] Optimisation du programme DerivArthN

Lors de mes recherches sur la dérivation arithmétique, j’ai buté sur un problème de temps d’exécution pour des nombres très grands (à propos des développements décimales de réel de plus en plus grand).

Ce problème de temps long d’exécution était gênant car je ne pouvais pas tester un nombre de cas trop grand (jusqu’à 10^{-13} près).

Voici l’ancienne version du programme DerivArthN (AV = ancienne version pour comparaison avec la nouvelle version) :

derivarthNAV(n):={
local m,p,L,D,N,s;
si n == 0 ou n==1 alors
retourne(0)
sinon
m := n;
p := 2;
s := 0;
L := []; D := []; N:=[];
tantque p <= m faire
tantque irem(m,p) == 0 faire
m := m/p;
L := [op(L),p];
ftantque
p := nextprime(p)
ftantque
tantque nops(L) <> 0 faire
D := [op(D),L(1)]
t := count_eq(L(1),L)
N := [op(N),t]
pour k de 1 jusque t faire
L := tail(L)
fpour
ftantque
pour k de 1 jusque nops(D) faire
s := s + N(k)/D(k)
fpour
retourne(n*s)
fsi}:;

Le problème de ce programme, c’est qu’il fait ce que Xcas peut faire automatiquement et très rapidement. En effet, le programme cherche la décomposition en facteurs premiers du nombre à dériver arithmétiquement. Cette décomposition en facteurs premiers d’un nombre entier n peut s’obtenir grâce à la commande ifactors(n).

Ainsi, la nouvelle version du programme DerivArthN est celle-ci (NV= Nouvelle Version pour comparaison avec l’ancienne version).

derivarthNNV(n):={
local m,p,L,D,N,s;
L := ifactors(n)
si n == 0 ou n==1 alors
retourne(0)
sinon
s := 0;
D := []; N:=[];
tantque nops(L) <> 0 faire
D := [op(D),L(1)]
N := [op(N),L(2)]
pour k de 1 jusque 2 faire
L := tail(L)
fpour
ftantque
pour k de 1 jusque nops(D) faire
s := s + N(k)/D(k)
fpour
retourne(n*s)
fsi}:;

On compare les résultats des deux versions :

> derivarthNNV(13293920192384920)

23903941725768044

> derivarthNAV(13293920192384920)

23903941725768044

On compare maintenant le temps d’exécution des deux versions :

> time(derivarthNNV(13293920192384920))

[0.0026,0.0022524218]

> time(derivarthNAV(13293920192384920))

[11.52,11.074820345]

Y’a pas photo !