やりたいこと
- LuaLaTexに含まれるLuaのFFIを用いて
- Pariライブラリを呼び出し
- LaTeX文書内に埋め込んだpari-gpのコードを実行する
いるもの
- LuaLaTeX
- Pari-gp
制限事項
Macでしか試していません.Linux/FreeBSDなどUnix互換環境でも上手くいくと思います.Windowsでは工夫がいるかもしれません.
きっかけ
@mod_poppo さんの記事「[ソケットを使ってLua/LuaTeX文書からMaximaを呼び出す] (https://qiita.com/mod_poppo/items/6a6c83cb8cd9dbd73627)」では,Maximaを起動し,ソケット越しにコマンドを送って結果を受け取っています.
一方,LuaLaTeXに含まれるLuaは,C FFIを持ち,Cで書かれたライブラリを動的に読み込んで実行することができます.ですので,Cで書かれた数値計算・数式処理系をLuaLaTeXから呼び出すことができるはずです.
今回は,著名な計算機数論ライブラリpari-gpを用います.(公式サイト http://pari.math.u-bordeaux.fr/ ).pari-gpは,Cで書かれたライブラリpariと,それを対話的に使うための簡易言語gpからなります.
準備
以下,Mac(macOS Mojave)上のTeX Live 2018での試行です. pari-gpはCaskにもありますが,上記の公式サイトで配布されているソースコードをコンパイルして導入したものを使っています(version 2.11.1).
実験
@mod_poppo さんの記事のリストを参考に,次のようなluaスクリプトを書きました:
local meta = {}
meta.__index = meta
local function new()
local ffi = require("ffi")
ffi.cdef[[
void pari_init(size_t parisize, unsigned long maxprime);
typedef long *GEN;
char* GENtostr(GEN x);
char* GENtoTeXstr(GEN x);
GEN gp_read_str(const char *s);
int printf(const char *fmt, ...);
]]
-- load Pari libray and initialize.
local libpari = ffi.load("pari")
-- The first arg is a stack size, the second arg is a limit of pre-computed prime numbers.
libpari.pari_init(600000, 10000)
return setmetatable({_libpari = libpari, _gp = gp}, meta)
end
function meta:gp(s)
local p = self._libpari
local str = ffi.cast("const char *", s)
-- ffi.C.printf("DEBUG: *** %s ***\n", str)
str = p.GENtostr(p.gp_read_str(str))
-- ffi.C.printf("DEBUG: *** %s ***\n", str)
return(ffi.string(str))
end
return { new = new,}
デバッグコードがコメントとして残っていますが,ご愛敬. そして次のようなLaTeX文書を作り,--shell-escape
つきでlualatexで処理します.
\documentclass{article}
\usepackage{amsmath,amsfonts}
\directlua{
parigp = dofile("callpari2.lua")
session = parigp:new()
}
\newcommand\pari[1]{\directlua{tex.print(session:gp([[#1]]))}}
\begin{document}
\paragraph{Class numbers of imaginary quadratic fields}
The class number of $\mathbb{Q}(\sqrt{-23})$ is \pari{qfbclassno(-23)}.
The structure of the class group is \pari{quadclassunit(-23)}.
\paragraph{Elliptic curve over the rationals}
Consider an elliptic curve $y^{2}+y = x^{3} - x^{2}$ defined over the
$\mathbb{Q}$. Pari's internal data are:
\pari{E=ellinit([0,-1,1,0,0])}.
The point $(0,0)$ is a
torsion point on it. Its order is \pari{ellorder(E, [0,0])}.
\end{document}
$ lualatex --shell-escape callpari2.tex
Todo
pariの計算結果を,もっと見やすく整形するなど,すべきことは沢山あると思います.また,数式処理系として別のもの(例えばCoCoALib)を試すのも面白そうです.
参考文献
上述の @mod_poppo さんの記事の他,LuaJITのFFIのreference, Henri Menke
, Tutorial: Using external C libraries with the LuaTEX FFI, TUGboat, Volume 39 (2018), No. 1 などを参考にしました.Menke氏のtutorialは,関数のプロットにGSLを使うというものです.