基礎的な関数
宣言 |
long numRows() const; |
概略 |
格子基底行列の行数を返す関数
|
引数 |
なし |
戻り値 |
格子基底行列の行数(つまり格子次元) |
解説 |
格子基底行列の行数,つまり格子次元を返す関数です.
|
サンプル
numColsを参照のこと.
宣言 |
long numCols() const; |
概略 |
格子基底行列の列数を返す関数
|
引数 |
なし |
戻り値 |
格子基底行列の列数 |
解説 |
格子基底行列の列数を返す関数です.
|
サンプル
#include <iostream>
#include "lattice.h"
int main()
{
// 3次正方行列を基底行列に持つ格子
Lattice<int> lat(3, 3);
std::cout << lat.numRows() << std::endl;
std::cout << lat.numCols() << std::endl;
return 0;
}
宣言 |
void setDims(const long n, const long m); |
概略 |
格子基底行列のサイズを設定する
|
引数 |
n |
: |
格子基底行列の行数 |
m |
: |
格子基底行列の列数 |
|
戻り値 |
なし |
解説 |
格子基底行列のサイズを設定する関数です.
具体的にはこの関数を使用することで\(\mathbb{R}^m\)上の\(n\)次元格子が用意されます.
但し,これを使用した場合基底行列は零行列として設定されるので,実際に使用する場合は別途値を指定する必要があります.
|
サンプル
なし
宣言 |
void setRandom(const long n, const long m, const T min, const T max); |
概略 |
ランダムにsvp-challenge型の格子基底を設定する
|
引数 |
n |
: |
格子基底行列の行数 |
m |
: |
格子基底行列の列数 |
min |
: |
乱数の下限 |
max |
: |
乱数の上限 |
|
戻り値 |
なし |
解説 |
格子基底行列をランダムに設定する関数です.
具体的にはこの関数を使用することで\(\mathbb{R}^m\)上の\(n\)次元格子が用意した上で,そこにランダムな基底を代入します.
但し,基底行列が非正則になることを避けるためにsvp-challenge型の基底行列に設定されます.
ここでいうsvp-challenge型の基底とは
\[
\begin{pmatrix}
* & 0 & 0 & \cdots & 0\\
* & 1 & 0 & \cdots & 0\\
* & 0 & 1 & \cdots & 0\\
* & \vdots & \vdots & \ddots & \vdots\\
* & 0 & 0 & \cdots & 1
\end{pmatrix}
\]
という形の基底行列を指します.
|
サンプル
#include <iostream>
#include "lattice.h"
int main()
{
// 3次正方行列を基底行列に持つ格子
Lattice<int> lat(3, 3);
// ランダムなSVP型格子に設定
lat.setRandom(3, 3, 1000, 9999);
// 基底行列の表示
std::cout << lat << std::endl;
return 0;
}
宣言 |
T volume(const bool compute_gso = true); |
概略 |
格子の体積(行列式)を計算する
|
引数 |
compute_gso |
: |
体積を計算する前にGSO情報を更新するかどうか |
|
戻り値 |
格子の体積 |
解説 |
格子の体積(つまり行列式)を計算する関数です.尚,格子\(L\)の体積とは格子基底\(\lbrace\boldsymbol{b}_1,\ldots,\boldsymbol{b}_n\rbrace\)のGSOベクトル\(\boldsymbol{b}_1^\star,\ldots,\boldsymbol{b}_n^\star\)に対して
\[
\mathrm{vol}(L)=\prod_{i=1}^n \|\boldsymbol{b}_i^\star\|
\]
と表される量です.
|
サンプル
#include <iostream>
#include "lattice.h"
int main()
{
// 3次正方行列を基底行列に持つ格子
Lattice<int> lat(3, 3);
// ランダムなSVP型格子に設定
lat.setRandom(3, 3, 1000, 9999);
// 体積
std::cout << lat.volume() << std::endl;
return 0;
}
宣言 |
double potential(const bool compute_gso = true); |
概略 |
格子基底のポテンシャル量を計算する
|
引数 |
compute_gso |
: |
ポテンシャル量を計算する前にGSO情報を更新するかどうか |
|
戻り値 |
格子基底のポテンシャル量 |
解説 |
格子基底のポテンシャル量(potential)を計算する関数です.尚,格子基底\(\boldsymbol{B}=\lbrace\boldsymbol{b}_1,\ldots,\boldsymbol{b}_n\rbrace\)のポテンシャル量とは,そのGSOベクトル\(\boldsymbol{b}_1^\star,\ldots,\boldsymbol{b}_n^\star\)に対して
\[
\mathrm{Pot}(\boldsymbol{B})=\prod_{i=1}^n \|\boldsymbol{b}_i^\star\|^{2(n-i+1)}
\]
と表される量です.
|
サンプル
#include <iostream>
#include "lattice.h"
int main()
{
// 3次正方行列を基底行列に持つ格子
Lattice<int> lat(3, 3);
// ランダムなSVP型格子に設定
lat.setRandom(3, 3, 1000, 9999);
// 体積
std::cout << lat.potential() << std::endl;
return 0;
}
宣言 |
void setBasis(const std::vector<std::vector<T>> basis_mat);
|
概略 |
格子基底行列を任意の行列として設定する
|
引数 |
|
戻り値 |
なし |
解説 |
格子基底行列を任意の行列で初期化する関数です.
|
宣言 |
void computeGSO(); |
概略 |
Gram-Schmidtの直交化ベクトルの二乗ノルムとGram-Schmidtの直交化係数行列(GSO情報)を計算する
|
引数 |
|
戻り値 |
格子ベクトル |
解説 |
基底行列のGram-Schmidtの直交化ベクトルの二乗ノルムとGram-Schmidtの直交化係数行列(GSO情報)を計算する関数です.
|
宣言 |
std::vector<T> mulVecBasis(const std::vector<long> v); |
概略 |
係数ベクトルを格子ベクトルに変換する
|
引数 |
なし |
戻り値 |
なし |
解説 |
係数ベクトルを基底行列に左から乗じて格子ベクトルに変換する関数です.
|
戻る