如何从Julia中的文本文件中读取多项式?
我使用程序包TypedPolynomals,我想从文本文件中读取多项式。我该怎么做 如果我使用如何从Julia中的文本文件中读取多项式?,julia,Julia,我使用程序包TypedPolynomals,我想从文本文件中读取多项式。我该怎么做 如果我使用 julia> poly = read("test.txt", String) 这会给我一根绳子。如何将其转换为多项式?以下是一些想法 你可以做的是Meta.parse和eval你读入的字符串。请注意,这不是一个安全的操作,所以您应该确保您读取的内容实际上可以安全运行(或者有人可能会擦除您的磁盘)。以下是一个例子: julia> @polyvar x x julia> p = ev
julia> poly = read("test.txt", String)
这会给我一根绳子。如何将其转换为多项式?以下是一些想法
你可以做的是Meta.parse
和eval
你读入的字符串。请注意,这不是一个安全的操作,所以您应该确保您读取的内容实际上可以安全运行(或者有人可能会擦除您的磁盘)。以下是一个例子:
julia> @polyvar x
x
julia> p = eval(Meta.parse("3x+4x^2"))
4x² + 3x
julia> dump(p)
Polynomial{Int64,Term{Int64,Monomial{(x,),1}},Array{Term{Int64,Monomial{(x,),1}},1}}
terms: Array{Term{Int64,Monomial{(x,),1}}}((2,))
1: Term{Int64,Monomial{(x,),1}}
coefficient: Int64 4
monomial: Monomial{(x,),1}
exponents: Tuple{Int64}
1: Int64 2
2: Term{Int64,Monomial{(x,),1}}
coefficient: Int64 3
monomial: Monomial{(x,),1}
exponents: Tuple{Int64}
1: Int64 1
另一个选项是包括
文件:
julia> @polyvar x
x
julia> p = include("test.txt")
4x² + 3x
julia> dump(p)
Polynomial{Int64,Term{Int64,Monomial{(x,),1}},Array{Term{Int64,Monomial{(x,),1}},1}}
terms: Array{Term{Int64,Monomial{(x,),1}}}((2,))
1: Term{Int64,Monomial{(x,),1}}
coefficient: Int64 4
monomial: Monomial{(x,),1}
exponents: Tuple{Int64}
1: Int64 2
2: Term{Int64,Monomial{(x,),1}}
coefficient: Int64 3
monomial: Monomial{(x,),1}
exponents: Tuple{Int64}
1: Int64 1
此方法也存在相同的风险(文件可能包含任意代码)
如果您想安全起见,您可能应该在Meta.parse
步骤之后检查生成的表达式是否实际上只是一个多项式。如果您不想使用eval
并将以前已知的变量放入局部范围,正如BogumiłKamiński建议的那样,您可以在几行代码中定义自己的解析器和求值器——多项式在语法上非常简单。在Julia中提供的一个解析器生成器中,这可能如下所示:
julia> function parse_polynomial(s)
@rule variable = r"[a-z]"p |> (v -> Variable{Symbol(v)}())
@rule number = r"\d+"p |> (digits -> parse(Int, digits))
@rule optional_number = number[:?] |> (c -> isempty(c) ? 1 : c[1])
@rule optional_exponent = (r"\^"p & number)[:?] |> (e -> isempty(e) ? 1 : e[1][2])
@rule monomial = variable & optional_exponent > ^
@rule term = optional_number & monomial > *, number
@rule polynomial = r"\s*" & term & (r"\+"p & term)[*] > ((_, t, r) -> reduce((a, plusb) -> a + plusb[2], r, init = t))
parse_whole(polynomial, s)
end
parse_polynomial (generic function with 1 method)
julia> parse_polynomial(" 3x+4x^2 ")
4x² + 3x
julia> parse_polynomial("2 x + 1 x ^ 2+ 203")
x² + 2x + 203
我假设+
在这里是可交换的。因为我在REPL中编写了代码,所以所有内容都打包到一个函数中,但是如果将其拆分,我们建议实际使用