Table of Contents
YAFU is the result of an ongoing hobby project to understand how to factor large integers, and how to factor them fast.
参考: How I install YAFU version 2 onto my Ubuntu Machines by EdH Yafu2 官方 thread: YAFU 2.0
0. 前置依赖
先准备一个空文件夹, 为了方便依赖和yafu2本体装在一个文件夹下
0.1 GMP
- 找到 https://gmplib.org/download/gmp 下最新版本并下载(比如我现在是
v6.2.1
) - 解压改名
./configure
和make
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.bz2tar jxvf gmp-6.2.1.tar.bz2mv gmp-6.2.1 gmpcd gmp./configuremakesudo make installmake check
0.2 GMP-ECM
- 找到 https://gitlab.inria.fr/zimmerma/ecm/-/releases 的最新 release (现在是
v7.0.5
) 然后复制他的下载链接(ecm-x.y.z.tar.gz
)并下载 - 解压改名
configure
和make
wget https://gitlab.inria.fr/zimmerma/ecm/uploads/89f6f0d65d3e980cef33dc922004e4b2/ecm-7.0.5.tar.gztar zxvf ecm-7.0.5.tar.gzmv ecm-7.0.5 gmp-ecmcd gmp-ecm./configuremakesudo make installmake check
0.3 msieve
- 找到 https://sourceforge.net/projects/msieve/files/msieve 的最新版本 (现在是
v1.53
) 然后下载源码 (msievexyz_src.tar.gz
或者msievexyz.tar.gz
) - 解压改名和
make
wget https://sourceforge.net/projects/msieve/files/msieve/Msieve%20v1.53/msieve153_src.tar.gz/downloadtar zxvf downloadmv msieve-1.53 msievecd msievemake all
0.4 ytools
- git clone
- 改 Makefile:
CC = gcc-7.3.0
=>CC = gcc
make
cd ytoolsvim Makefilemake
0.5 ysieve
- git clone
make
cd ysievemake
1. 安装 Yafu2
- git clone
git clone [email protected]:bbuhrow/yafu.git
- 修改 Makefile:
INC += -I../gmp_install/gmp-6.2.0/includeLIBS += -L../gmp_install/gmp-6.2.0/lib
INC += -I../ecm_install/include/LIBS += -L../ecm_install/lib/
to
INC += -I/usr/local/include/LIBS += -L/usr/local/include/
#INC += -I../ecm_install/include/#LIBS += -L../ecm_install/lib/
- 执行
lscpu
主要看核数和那些 cpu flag - 修改
yafu.ini
% threads=1ggnfs_dir=..\..\ggnfs-bin\x64\ecm_path=..\..\gmp-ecm\bin\mingw\ecm.exe
to
threads=<# CPU 数量>ggnfs_dir=../ggnfs/bin/ecm_path=/usr/local/bin/ecm
这里 ggnfs_dir
没装也没问题
5. [可选] 可以在下一步的 make 命令加上那些 CPU flag, 比如 make NFS=1 USE_SSE41=1 USEAVX2=1
, 不过这也可能导致问题, 我电脑上就只能编 NFS=1
6. make NFS=1
2 Troubleshooting
2.1 SIQS.c:2448: undefined reference to 'nextRoots_32k_avx2_intrin'
因为没有清理之前不同 flag 编译结果导致的, 在下一次 make
前执行 make clean
+ 那些 flag 就行
2.2 msieve 找不到 gzlib function
具体日志如下:
/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_open':savefile.c:(.text+0x132): undefined reference to `gzopen64'/usr/bin/ld: savefile.c:(.text+0x23e): undefined reference to `gzopen64'/usr/bin/ld: savefile.c:(.text+0x269): undefined reference to `gzopen64'/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_close':savefile.c:(.text+0x311): undefined reference to `gzclose'/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_write_line':savefile.c:(.text+0x3f9): undefined reference to `gzputs'/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_flush':savefile.c:(.text+0x46c): undefined reference to `gzputs'/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_eof':savefile.c:(.text+0x339): undefined reference to `gzeof'/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_read_line':savefile.c:(.text+0x39c): undefined reference to `gzgets'/usr/bin/ld: ../msieve//libmsieve.a(savefile.o): in function `savefile_rewind':savefile.c:(.text+0x499): undefined reference to `gzrewind'
在 yafu 的 Makefile 里面加上 LIBS+= -lc -lz