Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#401 Re : Programmation » divisions de grands nombres » 07-02-2018 08:58:52

J'ai repris les consignes d'affichage, afin de faire apparaître tous les zéros ...


  PROCEDURE We30(k: LongInt);
    CONST E1 = 10; E2 = 100; E3 = 1000;
    BEGIN
      IF (k<E1) THEN Write(' 000', k:1)
                ELSE IF (k<E2) THEN Write(' 00', k:2)
                               ELSE IF (k<E3) THEN Write(' 0', k:3)
                                              ELSE Write(' ', k:4)
    END;

  PROCEDURE AffXYP;
    CONST C1 = 2; C2 = 11;
    VAR k: Word;
    BEGIN
      E(1015); Wt(2, 2, 'Valeur de X:'); GotoXY(C2, 4);
      E(0012); FOR k:= (Max1 - 1) DOWNTO 0 DO We30(x[k]);
      E(0015); Wt(2, 6, 'Valeur de Y:'); GotoXY(C2, 8);
      E(0012); FOR k:= (Max1 - 1) DOWNTO 0 DO We30(y[k]);
      E(0015); Wt(2, 10, 'Valeur du produit (X*Y):');
      E(0010);
      GotoXY(C2, 12); FOR k:= (Max2 - 1) DOWNTO Max1 DO We30(p[k]);
      GotoXY(C2, 14); FOR k:= (Max1 - 1) DOWNTO 0 DO We30(p[k]); A_
    END;

... et voici ce qui apparaît sur l'écran:x3u9i1.png

#402 Re : Programmation » divisions de grands nombres » 06-02-2018 20:17:28

J'ai envoyé un message tout à[ l'heure, mais il y a eu apparemment un raté ...

Si le coeur du programme peut être compressé sur 5 lignes, au détriment de la clarté et du contrôle de l'algorithme, il y a par ailleurs toutes les instructions préliminaires relatives à la déclaration des constantes, des types et des variables, qui représentent une part non négligeable du code source.

On est donc très au-delà des cinq lignes de code annoncées ! ... même en laissant de côté les instructions d'affichage.

Il faut aussi tenir compte des restrictions imposées aux indices, à moins que les tableaux ne présentent tous la même longueur (d'où un gaspillage inutile d'espace mémoire); songer de plus à la rapidité en évitant de sommer des termes nuls.
Le programme suivant utilise la notation en base 10000 (solution la plus simple); les variables ont été introduites sous forme de constantes, afin de faciliter la vérification du résultat (sur Maxima).


  PROGRAM Multiplication;

  USES Crt, E_Texte;

  CONST Max1 = 10; Max2 = 2 * Max1; D_4: LongInt = 10000;

  TYPE LstE1 = ARRAY[0..Max1 - 1] OF LongInt;
       LstE2 = ARRAY[0..Max2 - 1] OF LongInt;

  CONST x: LstE1 = (1234, 2345, 3456, 4567, 6789, 7890, 8901,
                    9012, 0123, 1234);
        y: LstE1 = (4321, 5432, 6543, 7654, 8765, 9876, 0987,
                    1098, 2109, 0000);

  VAR NtX, NtY: Word; p, q: LstE2;

  PROCEDURE AffXYP;
    VAR k: Word;
    BEGIN
      E(1015); Wt(2, 2, 'Valeur de X:'); E(0012);     GotoXY(11, 4);
      FOR k:= (Max1 - 1) DOWNTO 0 DO Write(x[k]:5);
      E(0015); Wt(2, 6, 'Valeur de Y:'); E(0012);     GotoXY(11, 8);
      FOR k:= (Max1 - 1) DOWNTO 0 DO Write(y[k]:5);
      E(0015); Wt(2, 10, 'Valeur du produit (X*Y):'); E(0010);
      GotoXY(11, 12);
      FOR k:= (Max2 - 1) DOWNTO Max1 DO Write(p[k]:5);
      GotoXY(11, 14);
      FOR k:= (Max1 - 1) DOWNTO 0 DO Write(p[k]:5); A_
    END;

  PROCEDURE CalculP(VAR Im, Jm: Word; VAR X1, Y1: LstE1; VAR Pr: LstE2);
    VAR h, i, j, Hm: Word; s, t: LongInt;
    BEGIN
      FOR h:= 0 TO (Max2 - 1) DO Pr[h]:= 0;                                             // Mise à zéro
      h:= 0; WHILE ((X1[h]>0) AND (h<Max1 - 1)) DO Inc(h); Im:= h;            // Nombres de tranches de x et y
      h:= 0; WHILE ((Y1[h]>0) AND (h<Max1 - 1)) DO Inc(h); Jm:= h;
      Hm:= Im + Jm; s:= 0;                                                                     // Nombre de tranches pour le produit
      FOR h:=0 TO Hm DO
        BEGIN
          FOR i:= 0 TO h DO
            IF (i<=Im) THEN
              BEGIN
                j:= h - i;
                IF (j<=Jm) THEN Inc(s, X1[i] * Y1[j])
              END;
          Pr[h]:= s MOD D_4;
          t:= s DIV D_4; s:= t
        END;
      AffXYP
    END;

  BEGIN
    CalculP(NtX, NtY, x, y, p)
  END.

Il vaut mieux évidemment commencer l'indexation à zéro.

Voilà ce qu'affiche le programme Pascal, et le calcul effectué sur Maxima:
2njk5cp.png
(les éventuels zéros sur la gauche de chaque tranche ne sont pas représentés)
2dvv5lw.png

#403 Re : Programmation » divisions de grands nombres » 06-02-2018 12:02:22

hgaruo1951 a écrit :

... Oui M. Wiwaxia vous avez parfaitement raison mais ceci dit je peux obtenir le produit d'un nombre de 2000 chiffres par un nombre de 3000 chiffres en une fraction de seconde en utilisant le turbo pascal. Et ce calcul peut se faire (une fois introduit ces deux nombres ) au moyen d'un programme composé de cinq lignes pour le calcul et de trois lignes pour l'affichage ...

Avec Python ou Maxima, l'affirmation ne poserait aucun problème ... Mais avec Turbo Pascal (et pire encore version 5.5, puisque tu sembles ne pas connaître les entiers longs), franchement non !
A moins d'un énorme malentendu, volontaire ou non ...

hgaruo1951 a écrit :

Il faut aussi corriger : "diviser un nombre de 3000 chiffres par un nombres de 2000 chiffres"  et non l'inverse ...

La division est encore plus difficile à coder, et son exécution plus longue.

Je ne doute pas que tu aies pu rédiger un programme; mais qu'il se réduise à cinq lignes de code, cela ressemble fort à de la prestidigitation !

hgaruo1951 a écrit :

... Pour une division d'un nombre de 3000 chiffres par un nombre de 2000 chiffres (à titre d'exemple ) le programme principal pour effectuer une telle division (si le diviseur a comme chiffre des unité l'un des chiffres 1 , 3 ,7 ,9 et le reste de la division est un zéro )  ne comporte qu'une dizaine de lignes ...

Le programme principal peut se réduire à l'appel d'une procédure

BEGIN
  P1
END.

laquelle peut dissimuler cinq ou dix pages de code source !

Peut-on connaître ce code génial ? Je suis tout à fait preneur ...

#404 Re : Programmation » divisions de grands nombres » 06-02-2018 09:52:39

Bonjour,

Avec le Turbo Pascal 7 on dispose entre autres:
a) des entiers signés au format LongInt, au plus égaux à 231 - 1 = 2 147 483 647 , et
b) des variables de type Comp, théoriquement des entiers signés bornés par 263 - 1 ~ 9.22E18 er permettant des calculs en précision absolue sur 18-19 chiffres; ils sont cependant traités et affichés comme des réels, et il n'est pas possible d'effectuer directement sur eux les opérations de l'arithmétique (a DIV b et a MOD b).

Il est possible de travailler en précision absolue sur de très grands nombres, à condition de les exprimer sous forme de polynômes:
N = a0  + a1*B + a2*B2 + ... + an*Bn
et que les produits (ai*aj) ne dépassent jamais les limites précédentes.
On sera donc amené à choisir l'une des bases de numération suivantes: B = 104 (dans le cas de tableaux de LongInt) ou B = 109 si l'on prend les Comp).
L'algorithme conduisant au quotient et au reste de la division euclidienne ne sera pas le même dans l'un ou l'autre cas, pour la raison évoquée plus haut, et il faudra recourir à la programmation dynamique en raison du grand espace mémoire des variables.

L'utilisation de Virtual Pascal serait sous cet aspect beaucoup plus souple.

On doit trouver dans d'anciens livres d'exercices de TP des exemples de programmes traitant de problèmes apparentés. Je me rappelle de la recherche d'une racine carrée avec 10000 chiffres.

#405 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Curieuse curiosité mathémathique » 25-01-2018 09:40:53

Bonjour,

Il m'a semblé que le véritable problème, c'est d'espérer tirer quelque chose d'une grille dont les colonnes correspondent aux valeurs successives entières de la variable (x) ...

Si la seconde ligne contient par exemple les valeurs de la fonction A = xn , on trouvera sur la suivante celles de la dérivée correspondante:
B = A'(x) = n.xn-1 , soit encore: B = n.(A/x) .
Il intervient donc dans l'expression de (B) une donnée absente du tableau.

Le seul procédé apparenté que l'on pourrait envisager (quoi que beaucoup plus lourd à mettre en oeuvre) consisterait à entreprendre le calcul systématique des différences entre deux termes consécutifs d'une même ligne, jusqu'à obtenir un résultat nul - ou tout au moins constant.
On obtiendrait ainsi à partir de la fonction: A(x) = 1 + 21.x2 - 2.x3 :


     1     2     3     4     5     6     7     8     9    10
    20    69   136   209   276   325   344   321   244   101
    49    67    73    67    49    19   -23   -77  -143   +++
    18     6    -6   -18   -30   -42   -54   -66   +++   +++
   -12   -12   -12   -12   -12   -12   -12   +++   +++   +++

ce qui permet théoriquement de connaître le degré du polynôme, et de remonter à ses coefficients.

Cela ne marche malheureusement plus avec une fonction non polynômiale.

#406 Re : Le coin des beaux problèmes de Géométrie » Spirale sur plan ovoïdal » 08-01-2018 15:28:31

Bonjour,

Ce sujet m'intrigue moi aussi, d'autant plus qu'aucune réponse satisfaisante n'a été donnée:

Francis a écrit :

... malgré l'absence de réponse quant à la modélisation de ma double spirale que personne ne comprend ...

Je me permets donc d'apporter une contribution qui, bien que très tardive, ouvrira peut-être de nouvelles perspectives.

1°)

Francis a écrit :

... ce que je n'arrive pas à trouver c'est une spirale qui irait d'abord vers l'intérieur, puis sans jamais se croiser repartirait vers l'extérieur (donc comme un fil qu'on ferait tourner autour d'un oeuf... ovoïdal ...

Une spirale se rapprochant de son centre, puis s'en éloignant sans auto-intersection ni renversement de rotation, appartient obligatoirement à une surface comportant un trou, donc de forme localement apparentée à celle d'un hyperboloïde de révolution.
C'est le cas de la courbe paramétrée en (t) sur le domaine [-t0 ; t0], de coordonnées:
x = R.Ch(t).Cos(w.t)  ;  y = R.Ch(t).Sin(w.t)  ;  z = R.Sh(t)  ,
appartenant à la surface d'équation cartésienne:  x2 + y2 = R2 + z2
et présentant k = w/Pi enlacements autour de l'axe de symétrie (z'z).

2°) S'il s'agit d'une courbe fermée, il faut que les zones les plus éloignées de la surface se rejoignent, par exemple au niveau du plan équatorial (z = 0): le tore constitue alors la solution la plus simple, et l'on aura par exemple:
x = (A + B.Cos(w.t)).Cos(k.w.t) ; y = ((A + B.Cos(w.t)).Sin(k.w.t) ; z = B.Sin(w.t)   avec  (0 < B < A) et k entier supérieur à l'unité (il représente le nombre de boucles).

# Ces relations (à vérifier) ont été écrites d'un premier jet, faute de temps; il serait probablement avantageux de recourir aux coordonnées toroïdales.

# Il serait aussi intéressant de voir ce qui se passe pour un point parcourant lentement un cercle de Villarceau, lui-même en rotation autour de l'axe de son tore.

https://fr.wikipedia.org/wiki/Tore
https://www.mathcurve.com/surfaces/tore/tore.shtml

https://fr.wikipedia.org/wiki/Cercles_de_Villarceau

https://en.wikipedia.org/wiki/Toroidal_coordinates

#407 Re : Entraide (supérieur) » Devellopement » 29-12-2017 10:20:39

Bonjour,

Tu es en présence d'une fonction composée qu'il te suffit d'exprimer:
F(x) = Exp((1 + x)1/2) = Exp(1 + u - 1) = Exp(1).Exp(u - 1) = e.Exp(v) avec v = u - 1 = (1 + x)1/2 - 1 ;

(v) s'annulant pour x = 0 , il est possible de reprendre le développement limité classique correspondant au voisinage de cette valeur
Exp(v) = 1 + v + v2/2! + v3/3! + v3.e1(v) .


Il faut développer les expressions de (u - 1)2, (u - 1)3 , puis rassembler tous les termes en (1 + x)p - ce qui est effectivement un peu lourd ...
Les autres DL interviennent ensuite:
(1 + x)n = 1 + n.x + (n(n-1)/2!).x2 + (n(n-1)(n-2)/3!).x3 + x3.e2(x)

#408 Re : Entraide (supérieur) » Série numérique » 28-12-2017 09:48:34

Bonjour,

La suite proposée Un = (5n+(-2)n/)10n
est la somme de deux autres, dont d'une est monotone et l'autre alternée:
Un = Vn + Wn , avec Vn = (5/10)n  et  Wn = (-2/10)n .

Les sommes associées:
Sun = Sommek=0n(uk)
Svn = Sommek=0n(vk)
Swn = Sommek=0n(wk)
vérifient par définition: Sun = Svn + Swn
et les deux dernières sont celles de deux suites géométriques de raisons (0.5) et (-0.2), donc inférieures à l'unité en valeur absolue.

En conséquence Svn et Swn convergent et admettent pour limites respectives: Lv = 1/(1 - 0.5) = 2 , Lw = 1/(1 - (-0.2)) = 1/1.2 = 5/6 .
Donc Sun converge, et a pour limite Lu = Lv + Lw .

Une réponse plus rapide concernant la convergence de la première série est cependant possible dans la mesure où le rapport:
r = (un / vn) = (0.5n + (-0.2)n) / 0.5n = 1 + (-2/5)n
tend vers (1) losrque (n) tend vers l'infini (en raison du fait que Abs(-2/5) < 1);
la suite (un) est donc équivalente à (vn) quand (n) augmente indéfiniment, et comme la somme associée à cette dernière converge, il en va de même pour Sun.
N'est-ce pas l'un des critères de convergence des séries? (Lointains souvenirs ...)

#409 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » le plus court chemin entre deux points sur une sphère » 27-12-2017 12:13:53

@ yoshi
Merci, vraiment, pour ces précieuses informations que je vais archiver dans le dossier.

Je songeais à une solution de ce genre, mais qui me laissait dans l'embarras ... J'ignorais tout de ces ressources, et vais regarder tout cela de près.

#410 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » le plus court chemin entre deux points sur une sphère » 27-12-2017 10:17:51

Bonjour,

Comme aucune réponse complète ou adaptée n'a été donnée, voici quelques suggestions tardives sur la façon de procéder.

1°) Tout point (M) de la sphère de rayon (R) centrée à l'origine du repère orthonormé (Oxyz), et la projection orthogonale (H) de ce point sur le plan équatorial (xOy) vérifient:
OM = R ; OH = OM.Cos(t) = R.Cos(t) .
Ses coordonnées cartésiennes sont définies par les positions des projections orthogonales (I, J) du point (H) sur les axes (x'x, y'y), et celle (K) de (M) sur (z'z):
x = OI = OH.Cos(u) = R.Cos(t).Cos(u) ;
y = OJ = OH.Sin(u) = R.Cos(t).Sin(u) ;
z = OK = OM.Sin(t) = R.Sin(t) ;
elles vérifient naturellement l'équation de la sphère: R2 = x2 + y2 + z2 .

Figure
2°) La longueur de la corde reliant deux points (A, B) de cette surface se calcule directement à partir des coordonnées, au moyen de la relation de Pythagore:
d2 = AB2 = (xB - xA)2 + (yB - yA)2 + (zB - zA)2 ; il suffit pour cela d'utiliser les coordonnées géographiques (uA, tA et uB, tB) de chacun des deux points.

La longueur (LAB) de l'arc du grand cercle (route orthodromique) joignant les points (A) et (B) s'exprime simplement en fonction de l'angle
w = (OA, OB) déterminé par les vecteurs position correspondants, et qui est lié à leur produit scalaire;
on a en effet:
LAB = R.w , et (OAOB) = OA.OB.Cos(OA, OB) = R2.Cos(w) , d'où:

LAB = R.ArcCos((OAOB) / R2) .

3°) Dernier point: la précision des données angulaires paraît tout à fait excessive: 8 à 9 chiffres significatifs pour des longitudes et latitudes de l'ordre de 40 à 100° , 4 seulement pour le rayon ! L'imprécision sur les distances limite celle sur les résultats, et l'on peut se contenter de 4 ou 5 chiffres significatifs pour les angles - soit deux ou trois décimales.

Note: je m'aperçois que je ne peux pas (ou ne sais pas) insérer d'image à partir de l'ordinateur; je verrai plus tard ce qu'il m'est possible de faire.
# 28/12: Ça marche ! grâce aux conseils avisés de Yoshi. On apprend à tout âge.

#411 Re : Entraide (supérieur) » Devellopement limité » 27-12-2017 08:20:04

Bonjour,

Soit p(x) le produit: p(x) = sin(x).ch(2x) .

Il vient, en tenant compte du DL à l'ordre (3) de chacune des fonctions:

p(x) = (x - x3/3! + x3.e1(x)).(1 + (2x)2/2! + x3.e2(x)) = (1 + 2.x2 + x3.e2(x)).(x - x3/6 + x3.e1(x))

d'où, en effectuant le produit:
p(x) = x - x3/6 + x3.e1(x) ...
           + 2.x3 - (2/6).x5 + 2.x5.e1(x) + x3.e2.(x - x3/6 + x3.e1(x))

      = x + (11/6).x3 + x3.[e1(x).(1 + 2.x2) + e2(x).(x - x3/6 + x3.e1(x)) = x + (11/6).x3 + x3.e3(x)

expressions dans lesquelles (e1(x), e2(x), e3(x)) tendent vers zéro lorsque (x) tend vers (0).

Il ne reste plus qu'à ajouter le DL de la troisième fonction (ch(x)) pour parvenir à la réponse définitive.

Ma notation n'est sans doute plus celle actuellement employée; l'adaptation ne devrait pas poser de difficultés.

#412 Re : Entraide (supérieur) » aidez moi » 27-12-2017 01:40:45

Bonjour,

Pour la résolution de l'énoncé:

a³ = 3ab² +11
b³ = 3a²b + 2
a² + b² =  ?

je crois qu'une démonstration est possible à l'aide de coefficients complexes, en calculant:

z = (a + i.b)3 = a3 + 3i.a2b + 3i2.ab2 + i3.b3 ;

il vient en effet: z = a3 - 3.ab2 + i.(3.a2b - b3)

et compte tenu des deux équations données: z = 11 - 2.i .

Le passage aux normes conduit alors à:
║z║ = ║(a + i.b)3║ = ║a + i.b║3 = (a2 + b2 )3/2 = (112 + 22)1/2 = 1251/2 = 53/2 , d'où finalement: a2 + b2 = 5 .

# Je n'ai par contre pas du tout compris la démarche de Black Jack;

La résolution de ce système donne un seul couple (a,b) solution, c'est (-1 , 2)

S'agit-il d'un coup de bluff sur une bonne intuition, ou la réponse a-t-elle résulté d'une recherche de solutions numériques dans le plan ?

#413 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Polygones et cercle » 24-12-2017 09:50:04

Nathan.h a écrit :

... Il me semble que votre 2ème solution semble la mieux adaptée ...

La première solution (Ca) est la bonne si pour les (N - 2) autres points (Mk) du nuage l'angle (MiMkMj) dépasse un droit.

#414 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Polygones et cercle » 23-12-2017 08:40:23

Bonjour,

Les polygones envisagés étant de forme quelconque, je crois que ton problème est celui de la recherche du plus petit cercle circonscrit à un nuage de points.

Il intervient pour l'essentiel deux étapes:
a) la recherche du cercle admettant pour diamètre les deux points (Mi, Mj) les plus éloignés du nuage, et la vérification de ce que tous les autres points sont éventuellement situés à l'intérieur (soit Ca, s'il existe).
b) la recherche du plus petit cercle construit sur trois points, et contenant tous les autres (soit Cb).

La solution correspond à l'un des deux cercles précédents.

Voir le problème du cercle minimum.

#415 Enigmes, casse-têtes, curiosités et autres bizarreries » La bande des 9 » 21-12-2017 17:12:56

Wiwaxia
Réponses : 0

Bonjour,

J'ai trouvé par hasard sur un site de programmation l'énoncé d'un exercice relativement ancien, intitulé "la bande des 9" et dont je n'ai trouvé nulle trace sur la Toile. Faute de connaître le niveau de difficulté des éventuelles démonstrations, je poste le sujet sur ce forum.

L'énoncé de l'exercice (non résolu) était ainsi rapporté:
"Si l' on prend 3 nombres (a,b,c) composés chacun de 3 chiffres tels que a + b = c ,
et si les neufs chiffres utilisés sont (1,2,3,4,5,6,7,8,9) alors la somme des chiffres constituant le résultat (soit c) est toujours égale à 18 .
Exemples: 152 + 487 = 639 ; 238 + 419 = 657 .

Construire la solution qui permet de trouver tous les cas c'est à dire (a,b,c )."

L'énoncé m'a paru désagréablement incohérent, en ce qu'il demandait de construire un algorithme sur deux propriétés, dont l'une découle de l'autre, d'une manière vraisemblable mais nullement évidente pour moi.

1°) Je me suis donc lancé dans le codage d'un programme répondant au nouvel énoncé suivant:
(E1): Inventorier tous les triplets d'entiers naturels (a, b, c) inférieurs à 1000, utilisant les neufs chiffres du système décimal à l'exception du zéro, et tels que la somme des deux premiers (a + b) soit égale à (c) .
Vérifier que la somme des chiffres du troisième (c) est constante.

L'algorithme ne présentait pas de difficultés particulières, et a conduit à des résultats conformes:
# Nombre de triplets: Nt = 336    # Somme des chiffres: Smin = Smax = 18 .

2°) Cela m'a conduit à envisager une nouvelle version, plus générale:
(E2): Inventorier tous les triplets d'entiers naturels (a, b, c) inférieurs à 1000, utilisant les neufs chiffres du système décimal à l'exception de l'un d'entre eux, et tels que la somme des deux premiers (a + b) soit égale à (c) .
Vérifier que la somme des chiffres du troisième (c) est constante.

Et là, ô merveilles, sont encore apparus des résultats cohérents:

q   Ntr   Smin = Smax

0     336     18

1     104     13
2     208     17
3     104     12
4     192     16
5       96     11
6     208     15
7     104     10
8     208     14
9     168       9

La somme des chiffres de (c) dépend de la valeur du chiffres proscrit (q); elle est égale à (18 - q/2) lorsque (q) est pair, à (27 - q)/2 sinon.

Quelqu'un a-t-il rencontré quelque part ce problème - ou un énoncé apparenté - et (ou) une indication de démonstration concernant la constance et la valeur de Sc(q) ?
Merci d'avance pour toutes les informations que vous pourrez apporter.

Pied de page des forums