有一些众所周知的密码学算法来计算模幂运算(a ^ b)%c(这里有从右到左的二进制方法:http://en.wikipedia.org/wiki/Modular_exponentiation).
但是存在算法来计算形式的模幂运算(a ^(2 ^ N))%m比使用"经典"算法更快吗?
非常感谢你 !
注意 :
1)m可以是一个非常大的素数......或者不是(因此根据m不进行优化)
2)N可以大到2 ^ 32-1(N <2 ^ 32)
我有点困惑,因为默认参数模板和可变参数模板参数都必须是模板的最后一个参数.那么我的函数的官方语法是什么?
template<typename T, class T2 = double, unsigned int... TDIM> myFunction(/* SOMETHING */)
Run Code Online (Sandbox Code Playgroud)
要么
template<typename T, unsigned int... TDIM, class T2 = double> myFunction(/* SOMETHING */)
Run Code Online (Sandbox Code Playgroud) 是否有几个std::algorithm/lambda function访问nth满足给定条件的元素.因为std::find_if会访问第一个,所以有一个等价的找到nth一个吗?
我的问题非常简单:根据cppreference的std::intmax_t定义,为什么它与GCC 不对应?maximum width integer type__int128_t
请考虑以下代码:
template <unsigned int N>
struct myclass
{
unsigned int f() {return N;}
unsigned int g() {static_assert(N > 0, ""); return N-1;}
};
Run Code Online (Sandbox Code Playgroud)
问题:我是否保证以下代码将编译:
myclass<0> c;
c.f();
Run Code Online (Sandbox Code Playgroud)
但以下不会:
myclass<0> c;
c.f();
c.g();
Run Code Online (Sandbox Code Playgroud) 我不太了解std::is_sorted算法及其默认行为.如果我们查看cppreference,它会说默认情况下std::is_sorted使用<运算符.而不是那样,我发现使用<=是自然的.但我的问题是,对于以下数字列表:
1 2 3 3 4 5
Run Code Online (Sandbox Code Playgroud)
它会回来true,即使3 < 3应该false.怎么可能?
编辑:它似乎比我想象的更糟糕,因为std::less_equal<int>在这种情况下传递将返回false ...当我传递比较器函数时应用的条件是什么?
以下是在C++ 11中声明和初始化数组的8种方法g++:
/*0*/ std::array<int, 3> arr0({1, 2, 3});
/*1*/ std::array<int, 3> arr1({{1, 2, 3}});
/*2*/ std::array<int, 3> arr2{1, 2, 3};
/*3*/ std::array<int, 3> arr3{{1, 2, 3}};
/*4*/ std::array<int, 3> arr4 = {1, 2, 3};
/*5*/ std::array<int, 3> arr5 = {{1, 2, 3}};
/*6*/ std::array<int, 3> arr6 = std::array<int, 3>({1, 2, 3});
/*7*/ std::array<int, 3> arr7 = std::array<int, 3>({{1, 2, 3}});
Run Code Online (Sandbox Code Playgroud)
根据严格标准(以及即将推出的C++ 14标准),正确的是什么?什么是最常见的/使用的和那些要避免的(以及为什么)?
实现<运算符的最优化方法是什么,以std::bitset对应无符号整数表示的比较(它应该适用于位集more than 64 bits)?
一个简单的实现将是:
template<std::size_t N>
bool operator<(const std::bitset<N>& x, const std::bitset<N>& y)
{
for (int i = N-1; i >= 0; i--) {
if (x[i] && !y[i]) return false;
if (!x[i] && y[i]) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
当我说"最优化的方式"时,我正在寻找使用按位运算和元编程技巧(以及类似的东西)的实现.
编辑:我认为我找到了诀窍:模板元编程用于编译时递归和右位移,以便将位集比较为几个无符号长整数.但不明白如何做到这一点......
以下是完美定义的:
int x = 42, y = x;
Run Code Online (Sandbox Code Playgroud)
即严格等同于:
int x = 42;
int y = x;
Run Code Online (Sandbox Code Playgroud)
编辑:问题不是关于风格(我知道这是错误的......),问题是"理论上的"
这是一个非常天真的问题.如果我们查看C和C++标准委员会,他们目前正致力于添加十进制浮点标准类型:
所以看起来我们可能会有一个标准化decimal128类型,而我们还没有任何标准化binary128类型(四精度而不是简单的扩展双精度).这种情况有技术原因还是纯粹的"政治"?