Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Formulation Équation et partie entière de racine carrée
Aller à la page Précédente  1, 2, 3  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 31 Mar 2015 9:54    Sujet du message: Répondre en citant

Bonjour,
Oui, c'est du à des cumuls d'erreurs d'arrondis. On peut remédier à ceci en augmentant Digits (à 5000 sur cet exemple, on obtient bien 783 pour solution).

Code:

> Digits:=5000:
>  y:=(floor(105312799^(1/2)*x^(1/2))^2+2*floor(105312799^(1/2)*x^(1/2))-105312799*x+1)^(1/2);
>  L:=seq([k,evalf(subs(x=k,y))],k=1..1000):
>  S:=NULL:
>  for k in L do
>   if k[2]=floor(k[2]) then S:=S,[k[1],floor(k[2])] fi
>  od:
>  S;

                       1/2  1/2 2                    1/2  1/2
  y := (floor(105312799    x   )  + 2 floor(105312799    x   )

                           1/2
         - 105312799 x + 1)


            [783, 608], [840, 263], [899, 82], [960, 427]

 
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 31 Mar 2015 10:05    Sujet du message: Répondre en citant

Re-bonjour ALS,

C'est génial !
Là, les résultats sont bons, mais pensez-vous que pour les "grands" semi-premiers, la valeur 5000 pour Digits est ok...?
Ou faut-il augmenter la valeur de Digits pour les "grands" semi-premiers..?
Merci ALS, on touche la solution d'un doigt à mon avis : )

P.S.: Sinon, on a cette séquence aussi, mais le probléme j'arrive pas à demander à Maple les deux valeurs :

===================================
restart;
f := proc (x, p) options operator, arrow; sqrt(floor(sqrt(p*x))^2+2*floor(sqrt(p*x))-p*x+1) end proc;
a := seq(k, k = 1 .. 1000):
e := seq(f(i, 105312799), i = a):
S := NULL:
for k[i] in e do if type(k[i], integer) then S := S, [k[i], k] end if end do:
S;
====================================
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 31 Mar 2015 14:33    Sujet du message: Répondre en citant

Voici une procédure qui devrait vous permettre de tester en jouant sur le nombre de digits et aussi sur le nombre d'éléments de la liste souhaitée: elle comporte 3 paramètres formels p, digits et nbelements et une procédure interne pour le calcul de f(x,p)

Code:


> restart;

> test:=proc(p, digits, nbelements)
> local f,S,k,y;

> if digits<=kernelopts(maxdigits) then Digits:=digits else Digits:=kernelopts(maxdigits) fi:

> f := proc (x, p) options operator, arrow; evalf(sqrt(floor(sqrt(p*x))^2+2*floor(sqrt(p*x))-p*x+1)) end proc;

> S := NULL:
> for k to nbelements do y:=f(k,p): if y=floor(y) then S := S, [k, floor(y)] end if end do:
> S;
> end proc:

> test(105312799, 5000, 1000);


            [783, 608], [840, 263], [899, 82], [960, 427]


C'est bien if y=floor(y) qu'il faut mettre et non pas if type(y,integer). Sinon, comme j'ai fait évaluer numériquement y via la procédure f, le type de y n'est jamais entier mais toujours float (nb à virgule flottante) et S est alors vide en sortie.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 31 Mar 2015 16:11    Sujet du message: Répondre en citant

Re-bonjour ALS,

Merci beaucoup pour votre précieuse aide, je vais chercher à diviser un "grand nombre" pour tester notre algorithme : )

P.S.: Il est probablement possible, de savoir dans quelle fourchette, je veux dire quel intervalle, où il y aurait des multiplicateurs solutions...
Est-ce un intervalle entre sqrt(p) et sqrt(p)/2 ou etc etc... Si on arrivait à trouver ça, notre algorithme serait opérationnel à 1000% : )

Je vais donc tester des intervalles, et s'il y à une façon triviale de savoir dans quels intervalles, se trouvent, ces multiplicateurs solutions.

Sinon, en même temps, je vais essayer une alternative, en multipliant le p de départ par au moins 10 autres nombres semi-premiers, en espérant que dans la décomposition en différence de puissance de 2 du nouveau nombre, qu'il y aura une factorisation évidente du genre :

247 = [`2^8`, -`2^3`, -`2^0`] décomposition où il apparaît clairement ( contrairement à sa décomposition en somme...) une solution de factorisation.
Je vous tiens au courant
Et merci encore pour votre inestimable aide : )
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 02 Avr 2015 12:52    Sujet du message: Répondre en citant

Bonjour ALS,

J'avance doucement au niveau des graphiques, mais il manque encore un petit quelque chose, c'est surtout que j'arrive pas trop à manipuler la sonde de Maple, pour la forcer à donner les valeurs exactes des points sur une courbe...

Parallèlement, il y à ça aussi qui pourrait permettre probablement de trouver plus vite les multiplicateurs :

Notre équation peut-être amenée à cette égalité ( en partant du principe que la différence entre un carré et pk équivaut à 1) :

x² - pk = 1 Prenons le cas de 247

On se dit donc que :

x² - 247k = 1

x² -1 = 247k

(x+1) (x-1) = 247k

Dans cette équation, on voit donc qu'il faut juste trouver deux nombres ayant un écart de 2, et multipliés entres eux, ces deux nombres doivent être un multiple du nombre à factoriser, ici 247.

Pour 247, un couple possible est 78 et 76
On a 78*76 = 5928
Et 5928 est un multiple de 247 car 5928/247 = 24.

Ce qui est bien avec cette méthode, c'est que l'on peut tomber directement sur le facteur cherché de façon infinie, juste en le divisant par le produit de nombres ayant un écart de 2 avec ces deux nombres de préférence au dessous de la racine de p.

L'équation consiste donc à trouver 2 nombres au dessus de la racine de p et ayant un écart de 2 et que leur produit soit un multiple de p :

(x+1) (x-1) = 247k

Ou sinon x² = (247k) + 1
Donc un multiple de 247 à qui on ajoute 1 et qui soit un carré.

Il y à donc une équation simple qui donne les multiplicateurs de sorte que l'un des facteurs du nombre (pk) à factoriser est 1² :

f(x) = sqrt(px+1)

Pour 247 : g(x) = sqrt(247x+1)

Les points de cette courbe qui ont des coordonnées entières font donc parti des multiplicateurs cherchés.


Dernière édition par Guimzo le 02 Avr 2015 15:26; édité 3 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 02 Avr 2015 13:04    Sujet du message: Répondre en citant

Re-bonjour ALS,

Pourrait-on donc faire un générateur qui prend à chaque fois 2 nombres ayant un écart de 2 qu'on multiplie entre eux, et qu'on divise par le p de départ ; et l'opération continue tant que le résultat n'est pas un entier ou tant que dans la fraction ((n*(n+2)) / p on n'ait pas un dénominateur inférieur à p.

restart; p := (247);
q := floor(sqrt(p));
r := (q*q+2)/p

..??
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 03 Avr 2015 7:48    Sujet du message: Répondre en citant

Bonjour,
Cette petite procédure fera l'affaire pour p assez petit, mais pour les grandes valeurs ça risque d'être très long.

Code:


> restart:

> gener:=proc(p::posint)
> local k;
> k:=floor(sqrt(p)):
> while (k*(k+2) mod p >0) and (k<=p) do
>   k:=k+1
> od:
> k
> end proc:
 
> gener(247);

                                  76
> gener(6908219);
                                38717


Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 04 Avr 2015 10:58    Sujet du message: Répondre en citant

Bonjour ALS,

Merci beaucoup pour la séquence ; effectivement, pour les "grands" nombres, ça risque de mettre du temps : (
Je persévère : )
Bon week end de Pâques : )
À bientôt
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 14 Avr 2015 11:39    Sujet du message: Répondre en citant

Bonjour ALS,

Un multiplicateur par exemple qui permet de factoriser 247 :

k = 3085609887315750165443918061457377500463173455158158795051513631967765271954632958905603672847106657981547052047822525477060641446664945465
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 20 Avr 2015 15:20    Sujet du message: Répondre en citant

Bonjour ALS,

Je n'ai plus de vos nouvelles, bientôt 2 semaines...??
J'espère que ça va...??
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 20 Avr 2015 15:24    Sujet du message: Répondre en citant

Bonjour,
Oui tout va bien, merci, mais je n'avais pas vu les messages privés !
Voici la méthode de Newton, mais il y a des problèmes mathématiques pour votre fonction
g := x -> sqrt(floor(sqrt(247*x))^2+2*floor(sqrt(247*x))-247*x+1)-1
qui contient la fonction partie entière non dérivable aux points entiers.
Donc toute méthode numérique à base de dérivées est inapplicable à mon sens.

Code:


> newton := proc (f::procedure, a::numeric, eps::numeric) local g, x, k; g := unapply(x-f(x)/D(f)(x),x); k := 0; x := a;  while eps < abs(evalf(g(x)-x)) do k := k+1; x := evalf(g(x)):print(x) end do; print(`nombre d'itérations: ` = k,`  valeur approchée: ` = x) end proc;

> f:=x->x^3+x-1;

> newton(f,0.5,10^(-9));
    nombre d'itérations:  = 4,   valeur approchée:  = 0.6823278037




A+


Dernière édition par ALS le 21 Avr 2015 7:33; édité 1 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 20 Avr 2015 15:50    Sujet du message: Répondre en citant

Citation:

On a donc (floor(sqrt(px))+1)^2 - px = 1

(floor(sqrt(px))+1)^2 - px - 1 = 0

En développant :

[sqrt(px)]² + 1² +2*[sqrt(px)] -px - 1 = 0


Je ne suis pas d'accord sur le développement du carré, que faites-vous de la partie entière?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 21 Avr 2015 17:18    Sujet du message: Répondre en citant

Bonjour ALS,

Content de vous revoir : )
Merci pour l'Algo de Newton et les remarques.

Pour [sqrt(px)]² + 1² +2*[sqrt(px)] -px - 1 = 0

On peut poser que [sqrt(px)]² = (sqrt(px))² - Beta

Au final pour les cas où 1² est l'un des facteurs cherchés de (px) on arrive à une équation :

f(x) = (x²-1)/p

ou inversement

g(x) = sqrt(px+1)

Les points de la courbe représentative de f(x) et g(x), tels que leurs coordonnées soient entières, sont les multiplicateurs cherchés.

En attendant, on peut faire la séquence suivante, mais s'il vous plaît ALS, comment, faire de sorte que la séquence s’arrête dés qu'elle a trouvé au moins 2 résultats...?

Par exemple pour p = 77 on a les résultats suivants, en faisant varier (x) de 0 à 100 :

Res:= [[1, 0], [34, 15], [43, 24], [76, 75], [78, 79]]


Comment faire de sorte que la séquence s'arrête quand on a au moins deux résultats, ici, [1,0], [34,15]...................?


P.S: On peut remarquer que parmi les résultats, on a par exemple le point A(34;15) et le point B(43;24) tels que abcisse de A+ Abcisse de B = p = 77 et que Abcisse de A+ ordonnée de B = Ordonnée de A+ Abcisse de B

=========================

restart;
Digits := 1000;
f := proc (x) options operator, arrow: (x²-1)/p: end proc;
p := 77;
s := seq(j, j = 1 .. 100);
a := seq(f(i, p), i = s);
L := []; for k in s do if type(f(k), integer) then L := [op(L), [k, f(k)]] end if end do;
L;

=======================
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 21 Avr 2015 17:57    Sujet du message: Répondre en citant

(Suite)

Voici notre fonction :

f(x) = sqrt(px+1)

Les points de la courbe représentative de f(x), ayant des coordonnées entières sont les solutions de factorisation de (px) dont 1² est l'un des 2 membres de factorisation.

Pour par exemple p = 77.
Voici les points ( en dehors du couple [0,1] et des couples triviaux du genre [p-2, p-1] c'est à dire le couple [75;76] le couple[p+2;p+1] c'est à dire [79;78] etc etc ) et leurs coordonnées de façon ordonnée :

A(15;34), B(24;43), C(160;111) D(187;120) etc etc

Si on pose par rapport aux coordonnées des points A, B C et D respectivement :

A(x;y) B(w;z), C(r;s) D(t;u)

On a les relations suivantes entre autre :
( p =77 )

y + z = p
z+s = 2p
s+u = 3p
y-x = z-w

etc etc etc...

Comme on peut remarquer sur le graphique, les points ( en ROUGE ) A,B,C D etc qui sont solutions, sont répartis sous forme de 2 groupes et entre chaque groupe de deux, il y à deux points ayant pour coordonnées entières des valeurs triviales telles que (p-2;p-1) etc etc etc...

GRAPHIQUE :
https://scontent-cdg.xx.fbcdn.net/hphotos-xpf1/v/t1.0-9/11027459_1592743851005950_3965130041062781829_n.jpg?oh=e58b7284f60aeeb8644921f88cb8ad99&oe=55A179D5
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 22 Avr 2015 7:11    Sujet du message: Répondre en citant

Bonjour,
Pour limiter à 2 résultats dans la liste L, il suffit de rajouter
if nops(L)=2 then break fi dans la boucle:

Code:

> restart;
> Digits := 1000;
> f := proc (x) options operator, arrow: (x^2-1)/p: end proc;
> p := 77;
> s := seq(j, j = 1 .. 100): a := seq(f(i, p), i = s):
> L := []:  for k in s do if type(f(k), integer) then L := [op(L), [k, f(k)]]: if nops(L)=2 then break fi end if end do;
> L;

                            Digits := 1000


                                      2
                                     x  - 1
                           f := x -> ------
                                       p


                               p := 77


                          [[1, 0], [34, 15]]

Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Aller à la page Précédente  1, 2, 3  Suivante
Page 2 sur 3

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.