Ich versuche, einen GF-Typ nach Andreas Noacks Skizze in seiner Stanford-Vorlesung 2015 zu implementieren, habe aber einige Probleme früh. Ich bin mit Julia 0.3.10Julia parametrische Konstruktor - Probleme mit äußeren Konstruktor
Sein entsprechenden Code lautet wie folgt:
# Scalar finite fields
immutable GF{P,T<:Integer} <: Number
data::T
function GF(x::Integer)
return new(mod(x, P))
end
end
# methods for scalar finite field
import Base: convert, inv, one, promote_rule, show, zero
function call{P}(::Type{GF{P}}, x::Integer)
if !isprime(P)
throw(ArgumentError("P must be a prime"))
end
return GF{P,typeof(x)}(mod(x, P))
end
convert{P,T}(::Type{GF{P,T}}, x::Integer) = GF{P}(x)
convert{P}(::Type{GF{P}}, x::Integer) = GF{P}(x)
convert{P,T}(::Type{GF{P,T}}, x::GF{P}) = GF{P,T}(x.data)
promote_rule{P,T1,T2<:Integer}(::Type{GF{P,T1}}, ::Type{T2}) = GF{P,promote_type(T1,T2
)}
show(io::IO, x::GF) = show(io, x.data)
So das Problem erscheint, wenn Sie versuchen, und nur etwas zu definieren, wie diese
GF{2}(11)
Sie erhalten
Typ kann nicht konstruiert werden
Okay, es gibt also keinen automatischen Konstruktor.
GF{2,Int64}(11)
funktioniert gut.
Das Problem ist, mit keinem automatischen Konstruktor andere Funktionen (wie Null (x)) fehlschlagen.
Versuche, einen externen Konstruktor zu machen, haben nicht für mich gearbeitet:
denke ich GF{P}(x::Integer) = GF{P,Int64}(x)
arbeiten sollte, aber ich bekommen
Warnung: statische Parameter P in Unterschrift erfolgen für GF nicht an In [4]: 1. Die Methode kann nicht aufgerufen werden.
Grundsätzlich Ich laufe aus Ideen, wie zu spezifizieren, dass ein Anruf wie GF {3} (x) sollte eine Instanz von GF erstellen {3, typeof (x)} (x)
Ich weiß, dass mir etwas blendend offensichtlich fehlt.
Danke
Vielen Dank, das hat enorm geholfen, Umzug in den Entwicklungszweig scheint der Weg zu sein ... – Robin
@Robin Wenn Sie glauben, dass (ausgezeichnete) Antwort Ihre Frage beantwortet, dann geben Sie dies bitte durch Klicken auf das Häkchen neben zur Antwort und erwäge auch Up-Voting. Prost. –