1. 程式人生 > 其它 >PyTorch:張量、自動求導和平行計算

PyTorch:張量、自動求導和平行計算

a.位運算

1.快速冪

ll qmi(int m, int k, int p)
{
    ll res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

b.字首和與差分

1.一維字首和

a陣列:1 2 3 4 5 6

b陣列:1 3 6 10 15 21

\(b[i] = a[i] + b[i - 1] (下標從1開始)\)

求1,2的和,就可以轉換為\(b[2] - b[1 - 1]\)

,也就是求\(l-r\),為\(b[r] - b[l - 1]\);


2.二維字首和

通過一維字首和我們自然也可以推出二維字首和

\(s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]\)為從(x1,y1)到(x2,y2)二維陣列內的元素之和

例如

圖片s(x2,y2)為從(0,0)到此的總和,s(x1,y1)為從(0,0)到此的和。我們在如果要算(x1,y1)到(x2,y2)的之間元素的總和,我們需要把s(x2,y2)減去s(x2,y1)以及s(x1,y2)

然後還要加上s(x1,y1),因為該區域被減了二次。

所以可以得出\(s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]\)

公式,

\(s[x2][y1 - 1]\)可以類比一維的字首和,我們是減去下標前面的下標,之後也是相類似。


3.一維差分

1 2 3 4 5 6
1 1 1 1 1 1

差分處理:b[i] = a[i] - a[i - 1]

場景:

我們將下標1到下標3的數每個數加上一

使用樸素做法,那麼我們就要變數區域的每一個值加上一,\(0(n)\)的時間複雜度。

使用差分陣列,\(b[3 + 1] --,b[1]++\),只需要0(1)的時間複雜度。

還原陣列:b[i] += b[i - 1]

4.二維差分

使用上面二維字首和的例子
將(x1,y1)到(x2,y2)區域的陣列同時減或者加。

\[s[x2 + 1][y2 + 1] += c\newline s[x2 + 1][y1] -= c\newline s[x1][y2 + 1] -= c\newline s[x1][y1] += c \]

類似一維差分,是陣列的下一個下標進行。