我想知道在哪里找到源代码来展示如何在Python中实现运算符**.有人能指出我正确的方向吗?
python语法定义(使用pgen从中生成解析器),寻找'power':Gramar/Gramar
python ast,寻找'ast_for_power':Python/ast.c
python eval循环,查找'BINARY_POWER':Python/ceval.c
哪个调用PyNumber_Power(在Objects/abstract.c中实现):
PyObject * PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) { return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()"); }
基本上,调用pow插槽.对于长对象(3.0中唯一的默认整数类型),这是在long_pow函数Objects/longobject.c中实现的,对于int对象(在2.x分支中),它在int_pow函数Object/intobject.c中实现.
如果你深入了解long_pow,你可以看到在审查参数并进行一些设置之后,可以在这里看到取幂的核心:
if (Py_SIZE(b) <= FIVEARY_CUTOFF) { /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */ /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */ for (i = Py_SIZE(b) - 1; i >= 0; --i) { digit bi = b->ob_digit[i]; for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) { MULT(z, z, z) if (bi & j) MULT(z, a, z) } } } else { /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */ Py_INCREF(z); /* still holds 1L */ table[0] = z; for (i = 1; i < 32; ++i) MULT(table[i-1], a, table[i]) for (i = Py_SIZE(b) - 1; i >= 0; --i) { const digit bi = b->ob_digit[i]; for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) { const int index = (bi >> j) & 0x1f; for (k = 0; k < 5; ++k) MULT(z, z, z) if (index) MULT(z, table[index], z) } } }
其中使用了"应用密码学手册" 第14.6章中讨论的算法,该算法描述了用于任意精度算术的有效求幂算法.