這是一次將多項式模板的易用性與高效性結合的嘗試。進度見此 pastebin
怎樣有易用性?
封裝,用乙個vector
來存多項式,過載各種運算,特點是用的時候比較輕鬆,但本身的特性導致效率必然不能達到最優。
大概開放形如這樣的介面:
struct poly ;`
int*
base()
;// iterator
int&
operator
(int index)
;// reference
poly operator+(
const poly& rhs)
const
;// basic calculation
// operator + - * /
poly inv()
const
;// basic elementary function
poly pow
(int k)
;// power};
struct evaluationhelper
;struct polymod
;poly operator
""_z
(unsigned
long
long a);}
// sugar in c++11(?), you can use a_z to express a polynomial az now.
怎樣有高效性?
用的時候看不見的地方,在封裝的內部盡量提高效率,盡量使用較為友好的 ntt 方式,並且計算多項式帶入初等函式時,使用 negiizhao 整理的 fft 次數更少的迭代方法。
這點倒是沒什麼新穎的,頂多就是把位翻轉能做的某些工作在初始化的時候就幫忙做一下,有時間試一下 montgomery 約化什麼的管不管用:
struct ntt
void
fft(
int* a,
int lgn,
int d =1)
// ...
}} ntt;
經過測試,某些形式特殊的陣列的 ntt 改良版本,看似省略了部分計算,實則快取不友好,還不如直接做……
在比較普遍的做法中,我們倍增時通常會遞迴地計算需要的一些子部分,例如大部分初等函式中途都會用到倒數,而倍增的時候倒數內部本來是沒有必要重複計算一些東西的。這時為了效率,我們必須改遞迴為同輪遞推的倍增方法,也可以認為是一種記憶化搜尋。這樣一來我們呼叫的時候就達到了**中真正等價的 fft 次數。為此我搞了乙個牛頓迭代的外包結構體
struct newton nit;
它的外包作用就是幫助進行迭代的細節,因此我們在寫別的巢狀使用的時候就可以像這樣:
poly poly::
sqrt()
const
}return g.
slice
(deg()
);}
求積分的時候就要這種東西。
沒有必要每次都重新算一遍,設計乙個倍增式預處理的結構。
struct ******
******()
void
check
(int k)
}int
gfac
(int k)
// ...
} simp;
還不打算整合板子,見提交。
所謂的polymod
類的用法是類似實現乙個binaryoperator
的協議。特點在於多次取模同乙個多項式的時候,可以預處理這個多項式翻轉後的逆元的 ntt 的值。這樣能夠有效節省之後重複的計算。在單次乘法消耗大的情況下,減少快速冪過程中乘法的次數是極為有效的減小常數的方法,由四毛子 (four russians) 方法可以做到 log2
n+θ(
log
nlog
logn
)\log_2 n + \theta\left(\frac\right)
log2n
+θ(log
logn
logn)
次乘法。所以封裝了乙個快速冪裝置
template
<
classt,
class
comp
>
struct additionchain
static additionchain fourrussians
(const t &t,
const comp &comp,
int lgn,
const t &unit =1)
t pow
(int n)
const
};
第二代的Linux發行版
美國有乙個叫做 451集團 的組織,專門研究企業 it環境中的技術創新問題,發布需要付費購買的研究報告,並以此 為生 451集團 的研究報告是要賣錢的,言之無物的文章,對他們毫無用處。451集團 裡面有個 caos 理論部落格,這裡 caos 是指 commercial adoption of op...
5 理想中的Redis5 1 第二代Codis
codis作者談到第二代codis,即reborndb的發展方向 很值得學習 在開源codis後,我們收到了很多社群的反饋,大多數的意見是集中在zookeeper的依賴,redis的修改,還有為啥需要proxy上面,我們也在思考,這幾個東西是不是必須的。當然這幾個部件帶來的好處毋庸置疑,上面也闡述過...
組態王基於第二代Web發布平台的資訊整合解決方案
解決方案技術亮點 組態畫面遠端發布,圖形監控變數資料 以列表 曲線方式顯示變數實時資料 以列表 曲線方式顯示變數歷史資料 以圖表方式顯示及查詢資料庫資料 遠端使用者管理 分配操作許可權 遠端監控技術的挑戰 隨著internet的普及以及組態軟體開發能力的不斷提高,web server技術對於大多數組...