# `nna`——***NNA***（Natural Number Array）

## 功能
主要功能是**提供自然数大数运算**。但与传统实现不同，我们对大数的表示法进行了优化，名为***NNA***。具体数学推导见[NNA表示法](./prove/expression)。

## *NNA*的优势
*NNA*有以下相较于其他大数非常突出的优势：
- *NNA*表达紧凑，能够**减少大量表达冗余并减少运算循环次数**。
- *NNA*表达唯一，能够**避免前导零的冗余表达**。
- *NNA*十分轻量级，却能**使长度在$[0,100)$区间内的一百万次*NNA*进行加法运算的平均耗时约为2微秒**。

## 技术层面上的优化
*NNA*的`Limb`采用泛型来指定，因此可以根据使用场景调整`Limb`。
*NNA*没有固定的容器，**整个*NNA*围绕迭代器设计，将迭代器作为*NNA*的载体**，每个输出新的*NNA*的运算其实都是以迭代器的方式实现的。这样不仅能让*NNA*适应不同的容器，更重要的是，这样做可以支持数据流运算和惰性运算。
并且还**实现了`size_hint`方法**，使得将*NNA*放进动态容器里性能更高。

## *NNA*可能的不足
- *NNA*的表示法相较于传统的表示法稍微有些复杂，**可能会导致单次的遍历性能变慢**。但是更加紧凑的表达方式可能会弥补这一点，具体有待考证。
- *NNA*采用了迭代器作为载体，**可能会导致某个值在循环内重复计算的情况**。但是Rust编译器的优化能力应该能做到循环融合，融合的程度就看编译器的优化力度和优化能力了。

## 鸣谢
最后感谢各位的支持，我已经实现了加法和减法运算了，但减法运算的文档和注释还没写好。后续可能会提供更多运算（如乘法、除法、比较、基转换）和特殊情况下的高速算法。敬请期待吧！
