⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ap.h

📁 任意精度计算的实现
💻 H
字号:
#include <cstddef>
#include <iostream>
#include <fstream>


#if !defined(__AP_H)
#define __AP_H


// Uncomment if you are _sure_ that no memory allocation or file I/O will fail
// #define NDEBUG

#include <cassert>


// Assembler optimizations
// ASM should be defined in the makefile

#if defined (ASM)
#define USEASM
#endif


// Symbolic constants
const double MAX_PRECISE_DOUBLE = 9e15;     // Maximum double that can be presented exactly (approximately)


// Global variables

extern size_t Ramsize;
extern size_t CacheL1size;
extern size_t CacheL2size;
extern size_t Cacheburst;
extern size_t Cachetreshold;
extern size_t Cacheburstblocksize;
extern size_t Cachemaxblocksize;
extern size_t Cacheblocksize;
extern size_t Maxblocksize;
extern size_t Memorytreshold;
extern size_t Blocksize;
extern size_t NProcessors;

extern int Basedigits;

extern int fno;


// These use stuff declared until now
#include "modint.h"
#include "bigint.h"
#include "baseint.h"


extern rawtype Base;
extern rawtype Basedigit;
extern rawtype Basefactors[];
extern int NBasefactors;

extern rawtype primetable[];
extern rawtype moduli[3];
extern rawtype primitiveroots[3];
extern rawtype wftamoduli[3];
extern rawtype wftaprimitiveroots[3];

extern rawtype *workspace;
extern int workspaceused;


// Variables for WFTA

#if defined (WFTA)

extern modint *w_0[];
extern modint *iw_0[];
extern modint *w_1[];
extern modint *iw_1[];
extern modint *w_2[];
extern modint *iw_2[];
extern int n[];
extern int *s[];
extern int m[];
extern int *ms[];
extern int *p[];
extern int *ip[];

#endif  // WFTA


// Truncate function may be a standard function or not

extern "C"
{
    int truncate (const char *filename, long size);
}


// Functions in init.cpp

bool apinit (void);
void apdeinit (void);
void setmodulus (rawtype m);
void clearmodulus (void);


// Functions in prime.cpp

bool isprime (rawtype n);
rawtype nextprime (rawtype n);
rawtype getprime (rawtype n, rawtype u = MAXMODULUS);
size_t factor (rawtype f[], rawtype n);
modint primitiveroot (void);
void initmoduli (rawtype n);
void apbase (int digit);

// Functions in crt.cpp

void crt (rawtype *r, rawtype *m, size_t n);


// Functions in move.cpp

#if defined (USEASM)
extern "C"
{
#endif

void moveraw (void *d, void *s, size_t n);
void swapraw (void *d, void *s, size_t n);

#if defined (USEASM)
}
#endif


// Functions in file.cpp

const char *filename (int fno);


// Functions in scramble.cpp

size_t permute (size_t n, size_t nn);
void scramble (modint data[], size_t nn);
void initscrambletable (size_t ptable[], size_t nn);
void tablescramble (modint data[], size_t ptable[]);


// Functions in transpos.cpp

void transposesquare (modint data[], size_t n1, size_t n2);
void transpose (modint data[], size_t n1, size_t n2);


// Functions in fnt.cpp

void fnt (modint data[], modint pr, int isign, size_t nn, int s = 1);
void ifnt (modint data[], modint pr, int isign, size_t nn, int s = 1);


// Functions in tablefnt.cpp

#if defined (USEASM)
extern "C"
{
#endif

void tablefnt (modint data[], modint wtable[], size_t ptable[], size_t nn, int s = 1);
void itablefnt (modint data[], modint wtable[], size_t ptable[], size_t nn, int s = 1);

#if defined (USEASM)
}
#endif


// Functions in fourstep.cpp

void fourstepfnt (modint data[], modint pr, int isign, size_t nn);
void ifourstepfnt (modint data[], modint pr, int isign, size_t nn);


// Functions in tablefou.cpp

void tablefourstepfnt (modint data[], modint pr, int isign, size_t nn);
void itablefourstepfnt (modint data[], modint pr, int isign, size_t nn);


// Functions in sixstep.cpp

void sixstepfnt (modint data[], modint pr, int isign, size_t nn);
void isixstepfnt (modint data[], modint pr, int isign, size_t nn);


// Functions in tablesix.cpp

void tablesixstepfnt (modint data[], modint pr, int isign, size_t nn, int t = 3);
void itablesixstepfnt (modint data[], modint pr, int isign, size_t nn, int t = 3);


// Functions in tablesit.cpp

void tablesixstepfnttrans (modint data[], modint pr, int isign, size_t nn);
void tablesixstepfnttrans2 (modint data[], modint pr, int isign, size_t nn);
void itablesixstepfnttrans (modint data[], modint pr, int isign, size_t nn);
void itablesixstepfnttrans2 (modint data[], modint pr, int isign, size_t nn, size_t e = 1);


// Functions in wfta.cpp

void createpermutetables (void);
void createwtables (modint pr, modint *wt[], modint *iwt[], modint *w[], modint *iw[]);
void wfta (modint x[], modint *w[], int nn);


// Functions in sixwftat.cpp

void sixstepwftatrans (modint data[], modint *w[], modint pr, int isign, int n1, int n2);
void isixstepwftatrans (modint data[], modint *w[], modint pr, int isign, int n1, int n2);


// Functions in tabletwo.cpp

void tabletwopassfnt (std::fstream &in, modint pr, int isign, size_t nn);
void itabletwopassfnt (std::fstream &in, modint pr, int isign, size_t nn);


// Functions in tabletwt.cpp

void tabletwopassfnttrans (std::fstream &in, modint pr, int isign, size_t nn);
void tabletwopassfnttrans2 (std::fstream &in, modint pr, int isign, size_t nn, size_t o = 0);
void itabletwopassfnttrans (std::fstream &in, modint pr, int isign, size_t nn);
void itabletwopassfnttrans2 (std::fstream &in, modint pr, int isign, size_t nn, size_t o = 0, size_t e = 1);


// This uses stuff declared until now
#include "apfloat.h"


// Misc. functions

rawtype ap2rawtype (apstruct *a);

// Functions in carrycrt.cpp

int carrycrt (apstruct *ds1, apstruct *s2, apstruct *s3, size_t rsize);


// Functions in convolut.cpp

void multiplyinplace (apstruct *ds1, apstruct *s2);
void squareinplace (apstruct *ds);
apstruct *convolution (apstruct *s1, apstruct *s2, size_t rsize, size_t s1size, size_t s2size, size_t n, int *i);
apstruct *autoconvolution (apstruct *s, size_t rsize, size_t ssize, size_t n, int *i);


#endif  // __AP_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -