Hi Ondrej,

Here is the notebook I created:
http://nbviewer.ipython.org/3dfe97025f06876820b4

Please let me know if anything needs to be changed.

Regards,
Thilina.


On Tue, Jul 16, 2013 at 2:26 AM, Thilina Rathnayake
<thilina.r...@gmail.com>wrote:

> Hi Ondrej,
>
> Thank you very much for the quick response.
>
> I copied these two functions from my current diophantine.py and I forgot
> to copy the lines containing
> the imports. Sorry about that.
>
> I think both the outputs [2] and [3] are correct. In [3], since we called
> `descent(2, 1)` the equation is
> `w**2 = 2*x**2 + y**2`, and the output `(x, y, w) = (0, 1, 1)` satisfies
> the above equation. As I noticed,
> outputs generated by `descent()` when either `A` or `B` equals 1 are
> correct. Things go wrong when
> both A and B are different from 1. For example:
>
> >>>descent(2, 7) # equation w**2 = 2*x**2 + 7*y**2
> (1, 7, 3)
>
> Here,` (x, y, w) = (1, 7, 3)` and it is wrong because `3**2 != 2 * (1**2)
> + 7 * (7**2)`.
>
> I'll send you a notebook as soon as possible.
>
> Thank you and best regards,
> Thilina.
>
>
>
> On Tue, Jul 16, 2013 at 2:06 AM, Ondřej Čertík <ondrej.cer...@gmail.com>wrote:
>
>> On Mon, Jul 15, 2013 at 2:31 PM, Ondřej Čertík <ondrej.cer...@gmail.com>
>> wrote:
>> > Thilina,
>> >
>> > Thanks. You can use ipython notebook for exactly this exploration (let
>> > me know if you have any problems setting it up). Here it is:
>> >
>> > http://nbviewer.ipython.org/6003151
>>
>> P.S. One has to put
>>
>> from math import floor
>>
>> on top, and also the "divisors" function is not defined. Thilina, in
>> the meantime, you can send
>> a notebook that produces the wrong results and is executable and we
>> can then debug it.
>>
>> IPython notebook is very useful for such exploratory debugging.
>>
>> Ondrej
>>
>> >
>> > So the output [2] is correct, isn't it? But the output [3] seems
>> > incorrect to me, isn't it? Let me know which other output you found
>> > incorrect.
>> >
>> > I'll have a look at the book later.
>> >
>> > Ondrej
>> >
>> > On Mon, Jul 15, 2013 at 1:22 PM, Thilina Rathnayake
>> > <thilina.r...@gmail.com> wrote:
>> >> I attached the code herewith as a .py file so you can easily run it.
>> >>
>> >>
>> >> On Tue, Jul 16, 2013 at 12:47 AM, Thilina Rathnayake
>> >> <thilina.r...@gmail.com> wrote:
>> >>>
>> >>> Hi Ondrej,
>> >>>
>> >>> Thank you very much  for the words of encouragement. I am
>> implementing the
>> >>> descent method.
>> >>> I have used the solver you pointed out to validate answers for
>> quadratic
>> >>> Diophantine equations.
>> >>> We need something which solve the the ternary quadratic equations.
>> >>>
>> >>> I will continue implementing the algorithm as you suggested. I think
>> >>> that's the best way.
>> >>> I am confident that we will find some way to validate the results. I
>> >>> couldn't completely check PARI/GP
>> >>> and sage. They might contain a solver for ternary quadratic forms.
>> >>>
>> >>> I implemented the descent algorithm but it doesn't return the correct
>> >>> results. Here is the code.
>> >>>
>> >>> def descent(A, B):
>> >>>     """
>> >>>     Uses Lagrange's method to finda a solution to $w^2 = Ax^2 + By^2$.
>> >>>     Output a tuple $(x_0, y_0, z_0)$ which a solution to the above
>> >>> equation.
>> >>>     This solution is used as a base to calculate all the solutions.
>> >>>     """
>> >>>     if abs(A) > abs(B):
>> >>>         y, x, w = descent(B, A)
>> >>>         return (x, y, w)
>> >>>
>> >>>     if A == 1:
>> >>>         return (1, 0, 1)
>> >>>
>> >>>     if B == 1:
>> >>>         return (0, 1, 1)
>> >>>
>> >>>     if quadratic_congruence(A, B, 0.5) != None:
>> >>>         r = quadratic_congruence(A, B, 0.5)
>> >>>         Q = (r**2 - A)//B
>> >>>         div = divisors(Q)
>> >>>
>> >>>         B_0 = 0
>> >>>
>> >>>         for i in div:
>> >>>             if isinstance(sqrt(Q // i), Integer):
>> >>>                 B_0, d = i, sqrt(Q // i)
>> >>>                 break
>> >>>
>> >>>         if B_0 > 0:
>> >>>             X, Y, W = descent(A, B_0)
>> >>>             return (r*X + W, B*d*Y, A*X + r*W)
>> >>>
>> >>> def quadratic_congruence(a, m, k=1.0):
>> >>>     """
>> >>>     Solves the quadratic congruence $x^2 \equiv a \ (mod \ m)$.
>> Returns
>> >>> the
>> >>>     first solution in the range $0 .. \lfloor k*m \rfloor$.
>> >>>     Return None if solutions do not exist. Currently uses bruteforce.
>> >>>     Good enough for ``m`` sufficiently small.
>> >>>
>> >>>     TODO: An efficient algorithm should be implemented.
>> >>>     """
>> >>>     upper_bound = floor(abs(k*m)) + 1
>> >>>
>> >>>     for i in range(upper_bound):
>> >>>         if (i**2 - a)% abs(m) == 0:
>> >>>             return i
>> >>>
>> >>>     return None
>> >>>
>> >>> Perhaps you could take a look at it and tell me where I have done
>> wrong. I
>> >>> tried to follow
>> >>> almost the same symbols as in the algorithm. Here B_0 corresponds to
>> B' in
>> >>> the algorithm.
>> >>> Please take a look at it when you have some free time.
>> >>>
>> >>> Thank you and best regards,
>> >>> Thilina
>> >>>
>> >>>
>> >>> On Mon, Jul 15, 2013 at 9:01 PM, Ondřej Čertík <
>> ondrej.cer...@gmail.com>
>> >>> wrote:
>> >>>>
>> >>>> I see, it's the Chapter IV.
>> >>>> Are you going to implement the "Sieving method" (IV.3.1)? Or the
>> >>>> "descent method"?
>> >>>>
>> >>>> So, if I take the Pythagorean formula a^2 + b^2 = c^2, your new
>> solver
>> >>>> will be able to give me all integer solutions to this? That would be
>> >>>> really cool.
>> >>>>
>> >>>> As far as a solver, I found this one
>> >>>> (http://www.alpertron.com.ar/QUAD.HTM).
>> >>>> But it can only do equations for "x" an "y". You need equations for
>> >>>> "x", "y" and "z".
>> >>>>
>> >>>> I would suggest that you implement the solver, and then we just check
>> >>>> the solutions numerically, that should be quite easy. We will not
>> know
>> >>>> for sure that you got all the solutions, but just cite the algorithm
>> >>>> reference in the docstring, so that users know what it does. That
>> >>>> would be good start. If somebody later finds some other software that
>> >>>> can do this, or some other reference with examples and results, we
>> can
>> >>>> make sure that it returns all the solutions.
>> >>>>
>> >>>> Ondrej
>> >>>>
>> >>>> On Sun, Jul 14, 2013 at 11:21 PM, Thilina Rathnayake
>> >>>> <thilina.r...@gmail.com> wrote:
>> >>>> > This is what I use.
>> >>>> >
>> >>>> > “The Algorithmic resolution of Diophantine Equations”, Nigel P.
>> Smart,
>> >>>> > Chapter IV, Quadratic ternary forms.
>> >>>> >
>> >>>> > Here is the book:
>> >>>> >
>> >>>> >
>> >>>> >
>> >>>> > On Mon, Jul 15, 2013 at 2:20 AM, Aaron Meurer <asmeu...@gmail.com>
>> >>>> > wrote:
>> >>>> >>
>> >>>> >> On Sun, Jul 14, 2013 at 12:09 AM, Thilina Rathnayake
>> >>>> >> <thilina.r...@gmail.com> wrote:
>> >>>> >> > Hi All,
>> >>>> >> >
>> >>>> >> > I am planning to implement ternary quadratic forms, i.e
>> equations of
>> >>>> >> > the
>> >>>> >> > form,
>> >>>> >> > a*x**2 + by**2 + cz**2 + fxy + gyz + hzx = 0. It would be
>> better If
>> >>>> >> > I
>> >>>> >> > can
>> >>>> >> > find
>> >>>> >> > a system which currently implement this so I can validate my
>> >>>> >> > results. If
>> >>>> >> > you
>> >>>> >> > know
>> >>>> >> > of any system which solves this or a source which have good
>> >>>> >> > literature
>> >>>> >> > on
>> >>>> >> > the problem,
>> >>>> >> > please let me know.
>> >>>> >>
>> >>>> >> What is the literature that you plan to use to get the algorithm
>> in
>> >>>> >> the first place?
>> >>>> >>
>> >>>> >> Aaron Meurer
>> >>>> >>
>> >>>> >> >
>> >>>> >> > Also I have to solve the quadratic congruence x**2 = D (mod m)
>> as a
>> >>>> >> > sub
>> >>>> >> > problem to implement the algorithm I found. I found a few
>> algorithms
>> >>>> >> > on
>> >>>> >> > this
>> >>>> >> > but
>> >>>> >> > none of them explain precisely how to solve the general
>> equation,
>> >>>> >> > all
>> >>>> >> > they
>> >>>> >> > do is
>> >>>> >> > solve the equation for m prime and gcd(D, m) = 1 and just ask
>> to use
>> >>>> >> > Chinese
>> >>>> >> > remainder theorem to combine the results to solve for the
>> general
>> >>>> >> > case
>> >>>> >> > where
>> >>>> >> > m
>> >>>> >> > is not prime and gcd(D, m) not necessarily equal to 1. Any help
>> on
>> >>>> >> > this
>> >>>> >> > would
>> >>>> >> > be highly appreciated.
>> >>>> >> >
>> >>>> >> > Regards,
>> >>>> >> > Thilina
>> >>>> >> >
>> >>>> >> > --
>> >>>> >> > You received this message because you are subscribed to the
>> Google
>> >>>> >> > Groups
>> >>>> >> > "sympy" group.
>> >>>> >> > To unsubscribe from this group and stop receiving emails from
>> it,
>> >>>> >> > send
>> >>>> >> > an
>> >>>> >> > email to sympy+unsubscr...@googlegroups.com.
>> >>>> >> > To post to this group, send email to sympy@googlegroups.com.
>> >>>> >> > Visit this group at http://groups.google.com/group/sympy.
>> >>>> >> > For more options, visit
>> https://groups.google.com/groups/opt_out.
>> >>>> >> >
>> >>>> >> >
>> >>>> >>
>> >>>> >> --
>> >>>> >> You received this message because you are subscribed to the Google
>> >>>> >> Groups
>> >>>> >> "sympy" group.
>> >>>> >> To unsubscribe from this group and stop receiving emails from it,
>> send
>> >>>> >> an
>> >>>> >> email to sympy+unsubscr...@googlegroups.com.
>> >>>> >> To post to this group, send email to sympy@googlegroups.com.
>> >>>> >> Visit this group at http://groups.google.com/group/sympy.
>> >>>> >> For more options, visit https://groups.google.com/groups/opt_out.
>> >>>> >>
>> >>>> >>
>> >>>> >
>> >>>> > --
>> >>>> > You received this message because you are subscribed to the Google
>> >>>> > Groups
>> >>>> > "sympy" group.
>> >>>> > To unsubscribe from this group and stop receiving emails from it,
>> send
>> >>>> > an
>> >>>> > email to sympy+unsubscr...@googlegroups.com.
>> >>>> > To post to this group, send email to sympy@googlegroups.com.
>> >>>> > Visit this group at http://groups.google.com/group/sympy.
>> >>>> > For more options, visit https://groups.google.com/groups/opt_out.
>> >>>> >
>> >>>> >
>> >>>>
>> >>>> --
>> >>>> You received this message because you are subscribed to the Google
>> Groups
>> >>>> "sympy" group.
>> >>>> To unsubscribe from this group and stop receiving emails from it,
>> send an
>> >>>> email to sympy+unsubscr...@googlegroups.com.
>> >>>> To post to this group, send email to sympy@googlegroups.com.
>> >>>> Visit this group at http://groups.google.com/group/sympy.
>> >>>> For more options, visit https://groups.google.com/groups/opt_out.
>> >>>>
>> >>>>
>> >>>
>> >>
>> >> --
>> >> You received this message because you are subscribed to the Google
>> Groups
>> >> "sympy" group.
>> >> To unsubscribe from this group and stop receiving emails from it, send
>> an
>> >> email to sympy+unsubscr...@googlegroups.com.
>> >> To post to this group, send email to sympy@googlegroups.com.
>> >> Visit this group at http://groups.google.com/group/sympy.
>> >> For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "sympy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to sympy+unsubscr...@googlegroups.com.
>> To post to this group, send email to sympy@googlegroups.com.
>> Visit this group at http://groups.google.com/group/sympy.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to