33,010
社区成员
发帖
与我相关
我的任务
分享
public static long nextSeries(int firstNumber, int secondNumber, int number)
{
long value = number == 1 ? firstNumber : (number == 2 ? secondNumber : 0);
if (number > 2)
{
checked
{
if (firstNumber == secondNumber) value = (long)(fibonacci(number) * (ulong)firstNumber);
else
{
long square, left = firstNumber, right = secondNumber, divisor = (long)firstNumber * firstNumber - (long)firstNumber * (secondNumber -= firstNumber) - (long)secondNumber * secondNumber;
for (int bits = ((uint)number).bits() - 2; bits >= 0; bits--)
{
right = (firstNumber * (square = left * left + right * right) - secondNumber * right * (right + (left << 1))) / divisor;
left = (square - firstNumber * right) / secondNumber;
if ((number & (1L << bits)) != 0) left = (right += left) - left;
}
value = left;
}
}
}
return value;
}
public static ulong fibonacci(int number)
{
ulong value = 0;
if (number > 0)
{
ulong[] values = { 0, 1, 1, 2, 3 };
if (number < values.Length) value = values[number];
else
{
int bits = ((uint)number).bits() - 2;
ulong square, left = (number & (1 << bits)) == 0 ? 1UL : 2UL, right = left + 1;
checked
{
for (bits--; bits > 0; bits--)
{
if ((number & (1 << bits)) == 0)
{
left = (right * left << 1) - (square = left * left);
right = right * right + square;
}
else
{
right = ((left + right) * right << 1) - (square = right * right);
left = square + left * left;
}
}
value = (number & 1) == 0 ? (right * left << 1) - left * left : (right * right + left * left);
}
}
}
return value;
}