 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 31 Mar 2015 9:54 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 31 Mar 2015 10:05 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 31 Mar 2015 14:33 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 31 Mar 2015 16:11 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 02 Avr 2015 12:52 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 02 Avr 2015 13:04 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 03 Avr 2015 7:48 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 04 Avr 2015 10:58 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 14 Avr 2015 11:39 Sujet du message: |
|
|
Bonjour ALS,
Un multiplicateur par exemple qui permet de factoriser 247 :
k = 3085609887315750165443918061457377500463173455158158795051513631967765271954632958905603672847106657981547052047822525477060641446664945465 |
|
Revenir en haut de page |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 20 Avr 2015 15:20 Sujet du message: |
|
|
Bonjour ALS,
Je n'ai plus de vos nouvelles, bientôt 2 semaines...??
J'espère que ça va...?? |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 20 Avr 2015 15:24 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 20 Avr 2015 15:50 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 21 Avr 2015 17:18 Sujet du message: |
|
|
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 |
|
 |
Guimzo
Inscrit le: 02 Juin 2012 Messages: 210
|
Posté le: 21 Avr 2015 17:57 Sujet du message: |
|
|
(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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 22 Avr 2015 7:11 Sujet du message: |
|
|
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 |
|
 |
|
|
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
|

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.
|