60

PpHd (./59) :
Pollux (./58) :
Ben pour prendre l'exemple d'une interface haut-niveau vers may tu ne peux pas nier qu'on peut avoir envie de stocker l'entier (x+1)/2 dans une variable, puis après d'utiliser cette variable dans un calcul modulo p... Ca veut dire que si x avait une valeure concrète on aurait eu la vraie réponse, mais que s'il reste symbolique pouf ça dégénère en NAN, c'est pas le comportement qu'on veut (une TI qui est incapable d'intégrer une fonction la laisse intacte, elle ne remplace pas par NAN). C'est très courant en arithmétique de devoir faire ce genre de divisions, par exemple l'exposant du symbole de Legendre est (p-1)/2 ; tu peux me répondre que les exposants tu les calcules dans N, mais je te réponds que l'utilisateur peut vouloir les calculer dans phi(p) = p-1, et 2 n'est pas inversible modulo p-1 donc ça te ferait aussi un NAN*p + NAN.
En gros ta méthode consiste à peu de choses près à avoir un gros switch global "tout faire mod p" ou "ne rien faire mod p", mais c'est pas assez fin pour représenter tout ce qu'on veut faire, même si tu traites les exposants comme un cas spécial.

Oui.
Et ce que tu décris (et besoin) correspond plus à une fonction fonction 'rem' qui renvoie un reste qu'à une fonction modulo.
Ton interface de haut niveau aura je pense créé cette fonction rem la calculant.
Et je suis désolé, mais (x+1)/2 mod 2 doit donner NAN*x+NAN (qui est surement la réponse la plus compréhensible des CAS que je connaisse).
Et franchement, c'est à l'utilisateur de savoir ce qu'il fait. S'il calcule dans Z/pZ, faut pas s'étonner à avoir des NAN si on divise par p. S'il calcule dans les exposants, il ne calcule pas avec modulo. Avant de remplacer sa variable, il vérifie que c'est un entier. C'est évident. S'il veut quelque chose de plus souple, il écrit du code correct (et il a plein de moyens d'en faire). C'est pas comme si la future extension 'mod' ou si kernel_intmod étaient les seules façons de calculer un reste.
Je ne supporterai jamais le neu-neu proof. smile

C'est même pas une question de neuneu proof, c'est juste que ton truc est un gros switch global donc on ne peut pas faire tout ce qu'on veut. Pourquoi pas, hein, mais c'est quand même une limitation.
Pollux (./58) :
mod(4^(1/2),3) est transformé en mod(1^(1/2),3) = 1, je suppose ? Or évidemment si tu calcules la puissance avant de "simplifier" tu obtiens mod(2,3) = 2.

Sémantiquement non, car x^y avec y non entier est considéré comme une fonction classique (comme exp(y*ln(x)))

Donc 4^n n'est jamais simplifié en 1 ? :/

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

61

Pollux (./60) :
on ne peut pas faire tout ce qu'on veut.
Pollux (./60) :
Pourquoi pas, hein, mais c'est quand même une limitation.

Je ne suis pas censé supporte un langage complet. Juste une librairie de manipulation d'expression.
Elle doit permettre de tout faire à son niveau, et c'est ce qu'elle ferra.
Ensuite c'est peut être insuffisant pour tout modéliser. Je le sais, mais ce n'est pas le but originel.
Et tu ne m'as toujours pas donné ton exemple complet (parce que ce que tu as dit, je l'ai vite démonté ou alors je n'ai pas tout compris).
Pollux (./60) :
Donc 4^n n'est jamais simplifié en 1 ? :/

Pourquoi il le serait ? Si on ne sait rien sur n, on peut pas vraiment savoir ce que ca vaut.

62

Ben l'incohérence c'est que si tu prends la position "on va faire absolument tous les calculs mod p, sauf bien sûr pour les exposants où ça n'aurait pas de sens", alors c'est parfaitement logique modulo 3 de réduire sqrt(4) en sqrt(1) = 1 : la notion de racine carrée mod p n'est peut-être pas définie partout, elle est définie seulement au signe près, etc, mais elle a un sens. Dans ces conditions c'est logique de réduire ce qu'il y a sous la racine mod p, de même que tu réduis p*n en 0*n. C'est radicalement différent de la position "ah non surtout pas on ne peut pas simplifier sqrt(4) en sqrt(1), parce que ce sont deux entiers différents", qui considère d'abord les entiers puis prend la classe mod p de cet entier, et s'apparente donc plus à rem() qu'à mod(). Je ne sais pas si tu gères les trucs genre rootof(), mais c'est exactement pareil : pour être cohérent tu vas devoir réduire rootof(x^2-4) en rootof(x^2-1), ou plus généralement rootof(x^n-4) en rootof(x^n-1).

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

63

Pollux (./62) :
Ben l'incohérence c'est que si tu prends la position "on va faire absolument tous les calculs mod p, sauf bien sûr pour les exposants où ça n'aurait pas de sens", alors c'est parfaitement logique modulo 3 de réduire sqrt(4) en sqrt(1) = 1

Oui (Au passage, la position est "je considère l'expression dans Z/pZ(x,...z)"
Pollux (./62) :
La notion de racine carrée mod p n'est peut-être pas définie partout, elle est définie seulement au signe près, etc, mais elle a un sens.

Oui
Pollux (./62) :
Dans ces conditions c'est logique de réduire ce qu'il y a sous la racine mod p, de même que tu réduis p*n en 0*n.

Oui
Pollux (./62) :
C'est radicalement différent de la position "ah non surtout pas on ne peut pas simplifier sqrt(4) en sqrt(1), parce que ce sont deux entiers différents", qui considère d'abord les entiers puis prend la classe mod p de cet entier, et s'apparente donc plus à rem() qu'à mod().

Mais ce n'est pas cette position là.
Dans 4^n, on ne sait pas si n est complexe, donc on ne fait rien (4^I % 3, je ne sais pas trop ce que ca pourrait donner).
Pour les rationnels, le problème est le choix de la racine dans Z/pZ. Je n'ai pas trouvé un moyen de spécifier quelle racine retourner à 4^(1/2) % 3 (J'ai pas passé beaucoup de temps non plus). Ensuite, tu pourras me dire qu'à l'heure actuelle, ce n'est pas très consistant. Je suis d'accord c'est connu, et c'est dans la TODO list.
Le même problème survient sans modulo dans 1^(1/8) par exemple. Je dois retourner 1 ou la racine 8-ième de l'unité ?
Pollux (./62) :
Je ne sais pas si tu gères les trucs genre rootof(), mais c'est exactement pareil : pour être cohérent tu vas devoir réduire rootof(x^2-4) en rootof(x^2-1), ou plus généralement rootof(x^n-4) en rootof(x^n-1).

Oui

64

PpHd (./63) :
Pollux (./62) :
Ben l'incohérence c'est que si tu prends la position "on va faire absolument tous les calculs mod p, sauf bien sûr pour les exposants où ça n'aurait pas de sens", alors c'est parfaitement logique modulo 3 de réduire sqrt(4) en sqrt(1) = 1
Oui (Au passage, la position est "je considère l'expression dans Z/pZ(x,...z)"

Et c'est même un peu plus gros que ça, puisque tu considères que f(42) est équivalent à x ou z, et puis évidemment tu rajoutes l'exponentiation et tout.
Pollux (./62) :
C'est radicalement différent de la position "ah non surtout pas on ne peut pas simplifier sqrt(4) en sqrt(1), parce que ce sont deux entiers différents", qui considère d'abord les entiers puis prend la classe mod p de cet entier, et s'apparente donc plus à rem() qu'à mod().

Mais ce n'est pas cette position là. Dans 4^n, on ne sait pas si n est complexe, donc on ne fait rien (4^I % 3, je ne sais pas trop ce que ca pourrait donner).

Euh je veux bien que tu t'inquiètes des puissances complexes dans R, mais modulo p ? C'est possible que a^I puisse avoir un sens modulo p ? (si a!=1)
Pour les rationnels, le problème est le choix de la racine dans Z/pZ. Je n'ai pas trouvé un moyen de spécifier quelle racine retourner à 4^(1/2) % 3 (J'ai pas passé beaucoup de temps non plus). Ensuite, tu pourras me dire qu'à l'heure actuelle, ce n'est pas très consistant. Je suis d'accord c'est connu, et c'est dans la TODO list. Le même problème survient sans modulo dans 1^(1/8) par exemple. Je dois retourner 1 ou la racine 8-ième de l'unité ?

Ben le cas où tu prends la racine de 1 est justement le cas le plus simple : la racine la "mieux" est 1 -- de même que dans R, on prend les racines positives parce qu'elles sont "mieux". Donc pour 4^n, t'as pas trop de questions à te poser parce que 1^n = 1.


Enfin bon, toujours est-il que j'aime pas trop l'idée qu'on prend une expression dans C et puis tout d'un coup on lui colle un opérateur mod() qui lui change complètement la sémantique, ce qui fait que le résultat changera selon qu'on fait une évaluation partielle ou pas avant l'appel à mod(). Bref...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

65

Pollux (./64) :
Euh je veux bien que tu t'inquiètes des puissances complexes dans R, mais modulo p ? C'est possible que a^I puisse avoir un sens modulo p ? (si a!=1)

J'en sais rien smile
Pollux (./64) :
Ben le cas où tu prends la racine de 1 est justement le cas le plus simple : la racine la "mieux" est 1 -- de même que dans R, on prend les racines positives parce qu'elles sont "mieux". Donc pour 4^n, t'as pas trop de questions à te poser parce que 1^n = 1.

Probable.
Pollux (./64) :
Enfin bon, toujours est-il que j'aime pas trop l'idée qu'on prend une expression dans C et puis tout d'un coup on lui colle un opérateur mod() qui lui change complètement la sémantique, ce qui fait que le résultat changera selon qu'on fait une évaluation partielle ou pas avant l'appel à mod(). Bref...

Ben si tu évalues d'abord dans C, puis dans Z/pZ, tu obtiens ce que tu as voulu.
Je ne vois rien de choquant.

66

Ben non, puisque si y a des variables dont je connais pas la valeur elles vont être réévaluées dans Z/pZ et ça donnera n'importe quoi. Ca veut aussi dire que eval o subs(deux,2) o eval o subs(2,deux) n'est pas du tout équivalent à eval, ce qui est un peu bizarre parce que le but d'un CAS c'est de permettre des généralisations en remplaçant une valeur particulière par un symbole. Bref, faire une première évaluation dans C est un peu un hack puisque MAY ne se souviendra plus du contexte de cette évaluation et réinterprétera l'expression dans Z/2Z.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

67

Tu parles de quoi là? Des divisions dans le corps Z/pZ? Parce que pour +, - et ×, je ne vois pas en quoi évaluer d'abord dans C, puis dans Z/nZ changerait le résultat, étant donné les propriétés du modulo.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

68

(on est pas forcément dans un corps, un anneau suffit)
Oui, on parle de divisions, cf mon exemple des exposants de Legendre où on a besoin de parler de l'entier (p-1)/2 (cette division est toujours possible dans N parce que p est impair), et de le considérer modulo p-1 : on ne peut pas faire la division modulo p-1 parce que 2 n'est pas inversible. Bon c'est pas vraiment un exemple concret parce que c'est un peu trivial de savoir si un élément est un carré à partir de son logarithme mod p (c'est un carré ssi il est pair, d'où évidemment l'équivalence avec la multiplication par (p-1)/2 mod p-1), mais ça donne une idée du genre de problème qui peut arriver.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

69

Pollux (./66) :
Ben non, puisque si y a des variables dont je connais pas la valeur elles vont être réévaluées dans Z/pZ et ça donnera n'importe quoi.

Ca donnera exactement ce à quoi s'attendre. Le n'importe quoi c'est d'écrire mod((x+1)/2,2) et de penser que ca va faire ce que je veux sans savoir ce que ca fait.
Ce que tu veux, c'est évaluer (x+1)/2 dans Z, puis évaluer ce résultat mod 2. Pas évaluer (x+1)/2 mod 2 !
Pollux (./66) :
Ca veut aussi dire que eval o subs(deux,2) o eval o subs(2,deux) n'est pas du tout équivalent à eval, ce qui est un peu bizarre parce que le but d'un CAS c'est de permettre des généralisations en remplaçant une valeur particulière par un symbole.

Tu peux donner un exemple concret.. De préférence en utilisant l'API MAYLIB.
Le but d'un CAS est de faire des calculs algébriques, pas de faire autre chose.
Pollux (./66) :
Bref, faire une première évaluation dans C est un peu un hack puisque MAY ne se souviendra plus du contexte de cette évaluation et réinterprétera l'expression dans Z/2Z.

Qui t'empêche de faire une évaluation dans Z/2Z de suite ?

70

PpHd (./69) :
Pollux (./66) :
Ben non, puisque si y a des variables dont je connais pas la valeur elles vont être réévaluées dans Z/pZ et ça donnera n'importe quoi.

Ca donnera exactement ce à quoi s'attendre. Le n'importe quoi c'est d'écrire mod((x+1)/2,2) et de penser que ca va faire ce que je veux sans savoir ce que ca fait. Ce que tu veux, c'est évaluer (x+1)/2 dans Z, puis évaluer ce résultat mod 2. Pas évaluer (x+1)/2 mod 2 !

Ben on est d'accord, c'est juste ton conseil de lancer d'abord une évaluation dans Z puis une évaluation dans Z/2Z qui est foireux : si x était une valeur numérique ça va faire ce qu'on veut, si x ne l'était pas ça va foirer comme tu le soulignes.
Pollux (./66) :
Ca veut aussi dire que eval o subs(deux,2) o eval o subs(2,deux) n'est pas du tout équivalent à eval, ce qui est un peu bizarre parce que le but d'un CAS c'est de permettre des généralisations en remplaçant une valeur particulière par un symbole.

Tu peux donner un exemple concret.. De préférence en utilisant l'API MAYLIB. Le but d'un CAS est de faire des calculs algébriques, pas de faire autre chose.

// mettre la somme de x^0 à x^(n-1) dans p (a priori l'expand() ne fait rien puisque n est pas connu, mais bon)
expand((x^n-1)/(x-1)) -> p

mod(subs(n,42,p),x-1,x) = 42 top
subs(n,42,mod(p,x-1,x)) = polynôme en NAN sad
subs(un,1,subs(n,42,mod(p,x-un,x))) = 42 top

Comment est-ce que je peux me débrouiller pour que p soit vu comme un polynôme et pas comme une fraction rationnelle sans pour autant remplacer n par une constante ?
(c'est encore pire si tu tapes même pas la fraction toi-même et que le CAS remplace sum(x^i,i,0,n-1) par (x^n-1)/(x-1) : il y a un mismatch entre le CAS qui a fait ce remplacement en considérant que le résultat était un polynôme [c'est effectivement un polynôme, même s'il n'en a pas la forme] et mod() qui dit le contraire et que comme ça ressemble pas à un polynôme c'est que c'est une vilaine fraction rationnelle qui doit renvoyer NAN)
Pollux (./66) :
Bref, faire une première évaluation dans C est un peu un hack puisque MAY ne se souviendra plus du contexte de cette évaluation et réinterprétera l'expression dans Z/2Z.

Qui t'empêche de faire une évaluation dans Z/2Z de suite ?

Personne, je conteste juste "Ben si tu évalues d'abord dans C, puis dans Z/pZ, tu obtiens ce que tu as voulu." : tu ne peux pas obtenir ce que je veux même avec deux évaluations (sauf si tu manipules exclusivement des valeurs numériques).

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

71

Pollux (./70) :
// mettre la somme de x^0 à x^(n-1) dans p (a priori l'expand() ne fait rien puisque n est pas connu, mais bon)
expand((x^n-1)/(x-1)) -> p

mod(subs(n,42,p),x-1,x) = 42 top.gif
subs(n,42,mod(p,x-1,x)) = polynôme en NAN frown.gif
subs(un,1,subs(n,42,mod(p,x-un,x))) = 42 top.gif

Si déjà, ca marche comme çà direct, ca sera mieux que bien des CAS smile
(Et le résultat, c'est mod(42,x+1,x) wink
Pollux (./70) :
Comment est-ce que je peux me débrouiller pour que p soit vu comme un polynôme et pas comme une fraction rationnelle sans pour autant remplacer n par une constante ?


Je vois deux solutions:
+ créer une fonction 'id' identitée qui renvoie 'x' si 'x' est un entier/rationel/... ou polynome d'une variable exactement, ou id(x,flags) autrement (flags déterminant ce que l'on désire comme type). Une sorte de cast passif.
+ ajouter un parametre global qui fait que si on travaille mod 2, lorsqu'on tombe sur 1/2, on laisse 1/2, et on ne remplace pas par NAN..
+ même chose, mais au lieu d'être global, il est local et compris dans l'extension Mod.

72

Dites, ne pensez-vous pas qu'il serait plus important d'avoir d'abord un CAS qui fonctionne convenablement sur |R et/ou (C avant de vouloir faire de l'arithmétique sur les modulos ou de l'algèbre sur des groupes encore plus bizarres?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

73

(a mon avis ils veulent faire un truc intégré comme AMS, j'imagine qu'intégrer les autres trucs plus tard pourrait être vraiment chiant si c'est pas prévu dès le départ)

74

Mais un CAS de cette classe a-t-il vraiment besoin de gérer les calculs sur les anneaux d'arithmétique modulaire? AMS ne les gère pas.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

75

bah pas grave, pedrom sera mieux qu'AMS grin

76

Kevin Kofler (./74) :
Mais un CAS de cette classe a-t-il vraiment besoin de gérer les calculs sur les anneaux d'arithmétique modulaire? AMS ne les gère pas.

L'arithmétique modulaire est relativement indispensable dès qu'on fait des algos de reconstructions comme la factorisation sur les polynômes.
Kevin Kofler (./72) :
Dites, ne pensez-vous pas qu'il serait plus important d'avoir d'abord un CAS qui fonctionne convenablement sur |R et/ou (C avant de vouloir faire de l'arithmétique sur les modulos ou de l'algèbre sur des groupes encore plus bizarres?


Que manque-t-il pour rattraper AMS ?
factoriser sur N [ puis après sur R et C en utilisant quelques formules classiques pour les polynomes de degrée 2,3 et 4.]
Algèbre linaire sur les matrices (résolution des systèmes, déterminant, noyau, vecteurs propres, ...)
solve de polynome et/ou de systèmes linéaires et/ou de f(x) = alpha avec f dans une table.
Series
Limites via l'algo de Gruntz (nécessite un sous-ensemble de series je crois).
Primitive (par exemple, via une table + l'algo du "pauvre homme" qui ne nécessite qu'un solve et un factor).
Intégrales ?? Intégration numérique ?

Si on fait çà, on doit être très proche de tout ce que fait AMS (sauf les équa diffs, le solveur d'inéquation et l'algèbre booléenne).

Mais il manque les graphs, le langage et l'interface aussi !!! Et ce n'est pas rien non plus.
Quelqu'un de motivé pour çà ?

77

il faudrait quoi en fait comme ihm? un espèce d'écran home?

quid du pretty print?

78

squalyl (./77) :
il faudrait quoi en fait comme ihm? un espèce d'écran home?

A définir.
squalyl (./77) :
quid du pretty print?

C'est pas prioritaire à mes yeux, mais c'est à définir smile

79

bah topic alors, parce que sans ébauche de ce qu'il faut faire, on ira pas loin smile

80

squalyl (./79) :
bah topic alors, parce que sans ébauche de ce qu'il faut faire, on ira pas loin smile

Il a été créé où ?

81