On Sun, Feb 7, 2010 at 12:35 PM, Rolandb <[email protected]> wrote:
> Hi,
> Consider Euler’s famous expression x=a^2+n*b^2. I want to solve a and
> b, given x and n. Because solve_mod is totally broken, I tried to
> develop a clever method myself. Counterintuitively, I found that the
> most simple brute force method in SAGE is relatively fast.
>
> def bruteforce(number,n):
>    out=[]
>    for b in xrange(isqrt(number/n)):
>        (bool,a)=is_square(number-n*b^2,True)
>        if bool: out.append((a,b))
>    return out
>
> My questions are:
> -       Why is the brute force method relatively fast?
> -       Is there a clever approach (not dependent on solve_mod)?
>
> Thanks in advance! Roland

We have

   x=a^2+n*b^2 = (a-sqrt(n)*b)*(a+sqrt(n)*b) = Norm(a+sqrt(n)*b),

where the norm is in the quadratic field Q(sqrt(n)).  Thus a solution
corresponds to a factorization of the ideal generated by x in the ring
of integers of Q(sqrt(n)).    So here is some code related to your
question above, which you may or may not find relevant, depending on
whether you're making n big or x:

def eqn(x, n):
    """
    Solve x = a^2+n*b^2 when x is prime, n is not a square, and there
is a solution.

    EXAMPLES:

        sage: a,b =  eqn(13, -3); a,b
        (4, 1)
        sage: a^2 + -3*b^2
        13
        sage: a,b =  eqn(113, 97); a,b
        (-4, 1)
        sage: a^2 + 97*b^2
        113
    """
    proof.number_field(False)
    assert is_prime(x), "x must be prime"
    assert not is_square(n), "n must not be a square"
    R.<X> = QQ[]
    K.<a> = NumberField(X^2 + n)
    F = K.factor(x)
    if len(F) == 1 and F[0][1] == 1:
        raise ValueError, "no solution (x is inert)"
    A = F[0][0].gens_reduced()
    if len(A) > 1:
        raise ValueError, "no solution (ideal isn't principal)"
    return A[0][0], A[0][1]

-- 
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sage-support
URL: http://www.sagemath.org

Reply via email to