Sto cercando di implementare un tipo GF seguendo lo schizzo di Andreas Noack nella sua conferenza di Stanford del 2015, ma ho qualche problema all'inizio. Sto usando Julia 0.3.10julia parametrico costruttore - problemi con il costruttore esterno
suo codice rilevante è la seguente:
# 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)
Così il problema si presenta quando si tenta e proprio definire qualcosa di simile
GF{2}(11)
Si ottiene
tipo non può essere costruito
Ok, quindi non esiste un costruttore automatico.
GF{2,Int64}(11)
funziona correttamente.
Il problema è che nessun costruttore automatico ha altre funzioni (come zero (x)) non riuscito.
I tentativi di fare un costruttore esterno non hanno lavorato per me:
Penso GF{P}(x::Integer) = GF{P,Int64}(x)
dovrebbe funzionare, ma ho
Attenzione: static parametro P non si verifica in firma per GF a in [4]: 1. Il metodo non può essere richiamato.
Fondamentalmente io sono a corto di idee su come specificare che una chiamata come GF {3} (x) dovrebbe creare un'istanza di GF {3, typeof (x)} (x)
So che mi manca qualcosa di accecantemente ovvio.
Grazie
Grazie mille, questo è stato aiutato enormemente, il passaggio al ramo di sviluppo sembra essere la strada da percorrere ... – Robin
@Robin Se ritieni che questa risposta (eccellente) risponda alla tua domanda, ti preghiamo di indicare questo facendo clic sul segno di spunta successivo alla risposta e considerare anche l'up-voting. Saluti. –