public static void Main(){
long Hash((int A, int B) p, long worldSeed) {
long result = ((long)p.A << 32) + (int)p.B;
result -= (worldSeed * 3910451521 + result) * 108907987;
result ^= 0b101010101010101010101010101010101010101010101010101010101010101;
Console.WriteLine(Hash((0, 0), 0));
Polynomial p1 = new float[]{6, 8, 2};
Console.WriteLine(p1.ValueAt(11f));
Console.WriteLine(p1.Derivative.Derivative.Derivative);
public readonly int degree;
public Polynomial(int degree){
terms = new float[degree + 1];
for(int a = 0; a <= degree; a++){
private Polynomial(float[] coefficients){
degree = coefficients.Length - 1;
private Polynomial((float coefficient, int exponent) term){
throw new ArgumentOutOfRangeException("Negative exponents are not supported.");
terms = new float[degree + 1];
terms[0] = term.coefficient;
public static implicit operator Polynomial(float constant) => new Polynomial(new float[]{constant});
public static implicit operator Polynomial(float[] coefficients) => new Polynomial(coefficients);
public static implicit operator Polynomial((float coefficient, int exponent) term) => new Polynomial(term);
public float this[int inputDegree]{
if(inputDegree > degree || inputDegree < 0){
throw new IndexOutOfRangeException("The input degree is outside of the degree of this polynomial.");
return terms[degree - inputDegree];
if(inputDegree > degree || inputDegree < 0){
throw new IndexOutOfRangeException("The input degree is outside of the degree of this polynomial.");
terms[degree - inputDegree] = value;
public static Polynomial operator +(Polynomial left, Polynomial right){
if(left.degree < right.degree){
(left, right) = (right, left);
if(left.degree == right.degree){
Polynomial result = new Polynomial(left.degree);
for(int a = 0; a <= left.degree; a++){
result.terms[a] = left.terms[a] + right.terms[a];
Polynomial result = left;
for(int a = 0; a <= right.degree; a++){
result.terms[left.degree - right.degree + a] += right.terms[a];
public static Polynomial operator -(Polynomial left, Polynomial right){
if(left.degree < right.degree){
(left, right) = (right, left);
if(left.degree == right.degree){
Polynomial result = new Polynomial(left.degree);
for(int a = 0; a <= left.degree; a++){
result.terms[a] = left.terms[a] - right.terms[a];
Polynomial result = left;
for(int a = 0; a <= right.degree; a++){
result.terms[left.degree - right.degree + a] -= right.terms[a];
public static Polynomial operator *(Polynomial left, Polynomial right){
Polynomial result = new Polynomial(left.degree + right.degree);
for(int a = right.degree; a >= 0; a--){
for(int b = left.degree; b >= 0; b--){
result.terms[a + b] += left.terms[b] * right.terms[a];
public static bool operator ==(Polynomial left, Polynomial right){
if(left.degree == right.degree){
for(int a = 0; a <= left.degree; a++){
if(left.terms[a] != right.terms[a]){
public static bool operator !=(Polynomial left, Polynomial right){
if(left.degree == right.degree){
for(int a = 0; a <= left.degree; a++){
if(left.terms[a] != right.terms[a]){
public Polynomial Derivative{
Polynomial result = new Polynomial(degree - 1);
for(int a = 0; a < degree; a++){
result.terms[a] = (degree - a) * terms[a];
public override bool Equals(object obj) => obj is Polynomial q && new Polynomial(terms) == q;
public override int GetHashCode(){
int altBin = 0b1010101010101010101010101010101;
for(int a = 0; a < degree; a++){
result += (int)(121913909 * terms[a]) ^ ((int)(48960553 * terms[a + 1]));
public float ValueAt(float x){
float valueNum = MathF.Pow(x, degree);
for(int a = 0; a < degree; a++){
result += item * valueNum;
public static Polynomial Interpolate((float x, float y)[] values){
int degreeOfResult = values.Length;
Polynomial result = new Polynomial(degreeOfResult);
for(int a = 0; a <= degreeOfResult; a++){
Polynomial product = new Polynomial(0);
product.terms[0] = values[a].y;
for(int b = 0; b <= degreeOfResult; b++){
float denominator = values[a].x - values[b].x;
product *= (Polynomial)new float[]{1 / denominator, (-values[b].x) / denominator};
public override string ToString(){
for(int a = 0; a <= degree; a++){
bool termNegative = item < 0;
float coefficient = termNegative ? -item : item;
string coefficientStr = coefficient == 1 ? "" : $"{coefficient}";
string sign = termNegative ? (a == 0 ? "-" : " - ") : (a == 0 ? "" : " + ");
if(a == degree && coefficient > 0){
result += $"{sign}{coefficientStr}";
}else if(coefficient > 0 || a == 0){
string exponent = a == degree - 1 ? "" : $"^{degree - a}";
result += $"{sign}{coefficientStr}x{exponent}";