HyCodeYourTale
classpublicPriority 3

CoPrimeGenerator

com.hypixel.hytale.builtin.hytalegenerator.framework.math.CoPrimeGenerator

3

Methods

3

Public Methods

0

Fields

1

Constructors

Constructors

public
CoPrimeGenerator()

Methods

Public Methods (3)

publicstatic
void fillWithPrimes(int[] bucket)
publicstatic
long[] generateCoPrimes(long seed, int bucketSize, int numberOfBuckets, long floor)
publicstatic
boolean isPrime(int number)

Source Code

package com.hypixel.hytale.builtin.hytalegenerator.framework.math;

import java.util.Random;
import java.util.stream.IntStream;
import javax.annotation.Nonnull;

public class CoPrimeGenerator {
   public CoPrimeGenerator() {
   }

   public static long[] generateCoPrimes(long seed, int bucketSize, int numberOfBuckets, long floor) {
      if (bucketSize >= 1 && numberOfBuckets >= 1) {
         Random rand = new Random(seed);
         int[] primes = new int[bucketSize * numberOfBuckets];
         fillWithPrimes(primes);
         int[][] buckets = new int[numberOfBuckets][bucketSize];
         long[] output = new long[numberOfBuckets];
         IntStream.range(0, output.length).forEach(ix -> output[ix] = 1L);
         int indexOfBucket = 0;
         int indexOfPrime = 0;

         for (int indexInsideBucket = 0; indexOfPrime < primes.length; indexOfPrime++) {
            buckets[indexOfBucket][indexInsideBucket] = primes[indexOfPrime];
            if (indexOfBucket == numberOfBuckets - 1) {
               indexInsideBucket++;
            }

            indexOfBucket = (indexOfBucket + 1) % numberOfBuckets;
         }

         for (int i = 0; i < numberOfBuckets; i++) {
            while (output[i] < floor) {
               output[i] *= (long)buckets[i][rand.nextInt(bucketSize)];
            }
         }

         return output;
      } else {
         throw new IllegalArgumentException("invalid sizes");
      }
   }

   public static void fillWithPrimes(@Nonnull int[] bucket) {
      int number = 2;

      for (int index = 0; index < bucket.length; number++) {
         if (isPrime(number)) {
            bucket[index] = number;
            index++;
         }
      }
   }

   public static boolean isPrime(int number) {
      for (int i = 2; i < number; i++) {
         if (number % i == 0) {
            return false;
         }
      }

      return true;
   }
}