Yes, sorry about that. Using tuples for large polynomials is not a good idea 
but it does allow the type system to reason about degrees. I'm not sure how 
useful having the compiler reason about degrees really is though.

> On May 3, 2014, at 8:15 PM, andrew cooke <and...@acooke.org> wrote:
> 
> see the discussion at https://github.com/JuliaLang/julia/issues/5857 (search 
> for NTuple).  it seems that NTuple currently is not a contiguous block of 
> memory, but a collection of pointers to its contents.  it also seems that 
> this will change...
> 
> andrew
> 
> 
>> On Saturday, 3 May 2014 18:58:09 UTC-4, Andrea Pagnani wrote:
>> Strange behavior
>> 
>> I define Type Polynomial according to Stefan definition and 
>> 
>> julia> a = tuple(rand(500,1)...); b = tuple(rand(500,1)...);
>> julia> @time P1=Polynomial(a);
>> elapsed time: 24.441438322 seconds (614490296 bytes allocated)
>> julia> @time P2=Polynomial(b);
>> elapsed time: 2.4303e-5 seconds (7296 bytes allocated)
>> julia> @time P1 + P2;
>> elapsed time: 0.001270669 seconds (1037376 bytes allocated)
>>  
>>  
>> I tried with a tuple of 1000 random elements on my macBook Pro 4 Giga and it 
>> takes forever (and starts swapping). It seems that the compiler does not 
>> handle very well this Type (after the first round type definition for P1, 
>> creating P2 is super fast, and uses a reasonable amount of memory).
>> 
>> Of course one can use other strategies for polynomials, but the behaviour is 
>> somehow surprising.
>>  
>> 
>>  
>> 
>>> On Friday, May 2, 2014 5:55:50 PM UTC+2, Stefan Karpinski wrote:
>>> There isn't a built-in polynomial type, but it's pretty easy to make one. 
>>> If the type of the polynomial depends on its degree, then you can dispatch 
>>> on it. For example, you could do something like this:
>>> 
>>> immutable Polynomial{n,T<:Number}
>>>   a::NTuple{n,T}
>>> end
>>> Polynomial(a::Number...) = Polynomial(promote(a...))
>>> 
>>> function +{d1,d2}(p1::Polynomial{d1}, p2::Polynomial{d2})
>>>     d1 <= d2 || return p2 + p1
>>>     a = ntuple(d2) do k
>>>         k <= d1 ? p1.a[k] + p2.a[k] : p2.a[k]
>>>     end
>>>     Polynomial(promote(a...))
>>> end
>>> 
>>> julia> p1 = Polynomial(1,2,3)
>>> Polynomial{3,Int64}((1,2,3))
>>> 
>>> julia> p2 = Polynomial(1,2)
>>> Polynomial{2,Int64}((1,2))
>>> 
>>> julia> p3 = Polynomial(1,1.5)
>>> Polynomial{2,Float64}((1.0,1.5))
>>> 
>>> julia> p1 + p2
>>> Polynomial{3,Int64}((2,4,3))
>>> 
>>> julia> p1 + p3
>>> Polynomial{3,Float64}((2.0,3.5,3.0))
>>> 
>>> julia> p3 + p1
>>> Polynomial{3,Float64}((2.0,3.5,3.0))
>>> 
>>> julia> p3 + p2
>>> Polynomial{2,Float64}((2.0,3.5))
>>> 
>>> Since the degree of the polynomial is part of the type, you can dispatch 
>>> based on it. I'm not sure that's necessary though. You could always just 
>>> check what the degree of a polynomial is and choose between algorithms 
>>> explicitly.
>>> 
>>> 
>>>> On Fri, May 2, 2014 at 11:25 AM, Albert Díaz <albee...@gmail.com> wrote:
>>>> We are trying to develop a program to find the different roots of a nth 
>>>> degree polynomial using a few quite simple methods (fixed-point, 
>>>> bisection, newton..) and we would like to know how, when given a function, 
>>>> to recognise it's degree in order to choose between different root-finding 
>>>> methods.
>>>> 
>>>> 
>>>> Thanks 
>>> 

Reply via email to