尝试在 linux 上将 Mpir.NET 与 F# 结合使用
Trying to use Mpir.NET with F# on linux
我想在 Ubuntu 18.04 上使用 Mpir.NET 和 F# (4.5),在命令行上使用 dotnet。不成功。如果在F#linux上有更简单的Mpir.NET使用方法,请指教
遵循 dotnet 说明
https://docs.microsoft.com/en-us/dotnet/fsharp/get-started/get-started-command-line。
使用 Newtonsoft.Json 包的示例项目运行良好
当我构建一个项目来测试 Mpir.NET 时,出现如下所述的错误。
dotnet new sln -o MpirProj
dotnet new console -lang F# -o src/App
用 Mpir.NET 文档中的程序替换了 src/App/Program.fs:
open Mpir.NET
let a = 756749075976907490175905790287846502134Z
let b = 529134916478965674697197076070175107505Z
let c = a*b
printfn "%O" c
dotnet add src/App/App.fsproj package Mpir.NET
我收到以下 info/warn 消息:
warn : Package 'Mpir.NET 0.4.0' was restored using
'.NETFramework,Version=v4.6.1' instead of the project target framework
'.NETCoreApp,Version=v2.1'. This package may not be fully compatible
with your project. info : Package 'Mpir.NET' is compatible with all
the specified frameworks in project 'src/App/App.fsproj'. info :
PackageReference for package 'Mpir.NET' version '0.4.0' added to file
'/home/doug/f#favs/MpirProj/src/App/App.fsproj'.
dotnet sln add src/App/App.fsproj
生成的 App.fsproj 文件是:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Mpir.NET" Version="0.4.0" />
</ItemGroup>
</Project>
构建
dotnet build
消息
/home/doug/f#favs/MpirProj/src/App/App.fsproj : warning NU1701:
Package 'Mpir.NET 0.4.0' was restored using
'.NETFramework,Version=v4.6.1' instead of the project target framework
'.NETCoreApp,Version=v2.1'. This package may not be fully compatible
with your project. App ->
/home/doug/f#favs/MpirProj/src/App/bin/Debug/netcoreapp2.1/App.dll
Build succeeded.
当我 运行 时,请参阅下面的错误消息
~/f#favs/MpirProj/src/App$ dotnet run
消息
/home/doug/f#favs/MpirProj/src/App/App.fsproj : warning NU1701:
Package 'Mpir.NET 0.4.0' was restored using
'.NETFramework,Version=v4.6.1' instead of the project target framework
'.NETCoreApp,Version=v2.1'. This package may not be fully compatible
with your project. /home/doug/f#favs/MpirProj/src/App/App.fsproj :
warning NU1701: Package 'Mpir.NET 0.4.0' was restored using
'.NETFramework,Version=v4.6.1' instead of the project target framework
'.NETCoreApp,Version=v2.1'. This package may not be fully compatible
with your project.
Unhandled Exception: System.TypeInitializationException: The type
initializer for 'Mpir.NET.mpir' threw an exception. --->
System.Exception: MPIR: can't determine path to the xmpir.so at
Mpir.NET.mpir.LocateLibrary(String name) at
Mpir.NET.mpir.GetXMPIRLibraryPath() at
Mpir.NET.mpir.initialize_hxmpir() at Mpir.NET.mpir..cctor() ---
End of inner exception stack trace --- at
Mpir.NET.mpir.mpz_init_set_str(String str, UInt32 _base) at
Mpir.NET.NumericLiteralZ.FromString(String s) at
.$Program.main@() in
/home/doug/f#favs/MpirProj/src/App/Program.fs:line 3
您看到此问题是因为该程序包适用于 .NET Framework,但您是在 Ubuntu 上的 .NET Core 上构建和 运行。引用 .NET Framework .dll 以实现兼容性仅适用于 Windows(如果它适用于其他地方,那基本上只是巧合)。
我建议请求更新包以支持 .NET Core,或者寻找与 .NET Core 兼容的替代方案。
我在 windows 10 上尝试了 Mpir.NET,执行时间比使用 F# bigintegers 慢得多。
我喜欢 F# 的很多东西,但是双整数速度很慢,而且似乎没有替代方案。
我用 F# 解决 Pollard rho 分解问题的最佳时间是 28 秒。在 Ocaml(Windows 10、Ubuntu 和 Fedora)上使用完全相同的算法,经过的时间都是 10 秒。
我想在 Ubuntu 18.04 上使用 Mpir.NET 和 F# (4.5),在命令行上使用 dotnet。不成功。如果在F#linux上有更简单的Mpir.NET使用方法,请指教
遵循 dotnet 说明 https://docs.microsoft.com/en-us/dotnet/fsharp/get-started/get-started-command-line。 使用 Newtonsoft.Json 包的示例项目运行良好 当我构建一个项目来测试 Mpir.NET 时,出现如下所述的错误。
dotnet new sln -o MpirProj
dotnet new console -lang F# -o src/App
用 Mpir.NET 文档中的程序替换了 src/App/Program.fs:
open Mpir.NET
let a = 756749075976907490175905790287846502134Z
let b = 529134916478965674697197076070175107505Z
let c = a*b
printfn "%O" c
dotnet add src/App/App.fsproj package Mpir.NET
我收到以下 info/warn 消息:
warn : Package 'Mpir.NET 0.4.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.1'. This package may not be fully compatible with your project. info : Package 'Mpir.NET' is compatible with all the specified frameworks in project 'src/App/App.fsproj'. info : PackageReference for package 'Mpir.NET' version '0.4.0' added to file '/home/doug/f#favs/MpirProj/src/App/App.fsproj'.
dotnet sln add src/App/App.fsproj
生成的 App.fsproj 文件是:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Mpir.NET" Version="0.4.0" />
</ItemGroup>
</Project>
构建
dotnet build
消息
/home/doug/f#favs/MpirProj/src/App/App.fsproj : warning NU1701: Package 'Mpir.NET 0.4.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.1'. This package may not be fully compatible with your project. App -> /home/doug/f#favs/MpirProj/src/App/bin/Debug/netcoreapp2.1/App.dll
Build succeeded.
当我 运行 时,请参阅下面的错误消息
~/f#favs/MpirProj/src/App$ dotnet run
消息
/home/doug/f#favs/MpirProj/src/App/App.fsproj : warning NU1701: Package 'Mpir.NET 0.4.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.1'. This package may not be fully compatible with your project. /home/doug/f#favs/MpirProj/src/App/App.fsproj : warning NU1701: Package 'Mpir.NET 0.4.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.1'. This package may not be fully compatible with your project.
Unhandled Exception: System.TypeInitializationException: The type initializer for 'Mpir.NET.mpir' threw an exception. ---> System.Exception: MPIR: can't determine path to the xmpir.so at Mpir.NET.mpir.LocateLibrary(String name) at Mpir.NET.mpir.GetXMPIRLibraryPath() at Mpir.NET.mpir.initialize_hxmpir() at Mpir.NET.mpir..cctor() --- End of inner exception stack trace --- at Mpir.NET.mpir.mpz_init_set_str(String str, UInt32 _base) at Mpir.NET.NumericLiteralZ.FromString(String s) at .$Program.main@() in /home/doug/f#favs/MpirProj/src/App/Program.fs:line 3
您看到此问题是因为该程序包适用于 .NET Framework,但您是在 Ubuntu 上的 .NET Core 上构建和 运行。引用 .NET Framework .dll 以实现兼容性仅适用于 Windows(如果它适用于其他地方,那基本上只是巧合)。
我建议请求更新包以支持 .NET Core,或者寻找与 .NET Core 兼容的替代方案。
我在 windows 10 上尝试了 Mpir.NET,执行时间比使用 F# bigintegers 慢得多。
我喜欢 F# 的很多东西,但是双整数速度很慢,而且似乎没有替代方案。
我用 F# 解决 Pollard rho 分解问题的最佳时间是 28 秒。在 Ocaml(Windows 10、Ubuntu 和 Fedora)上使用完全相同的算法,经过的时间都是 10 秒。