4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LuaLaTeXのFFIを使ってPariライブラリを呼び出す

Last updated at Posted at 2019-06-09

やりたいこと

  • 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スクリプトを書きました:

callpari2.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で処理します.

callpari2.tex
\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}
terminal1
$ lualatex --shell-escape callpari2.tex

次のような結果が得られます:
スクリーンショット 2019-06-09 18.13.55.png

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を使うというものです.

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?