mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-22 14:05:33 +00:00
251 lines
6.9 KiB
Java
251 lines
6.9 KiB
Java
/*
|
|
* @(#)IntMath.java
|
|
*
|
|
* Copyright (c) 2002-2012 Werner Randelshofer, Goldau, Switzerland.
|
|
* All rights reserved.
|
|
*
|
|
* You may not use, copy or modify this file, except in compliance with the
|
|
* license agreement you entered into with Werner Randelshofer.
|
|
* For details see accompanying license terms.
|
|
*/
|
|
|
|
package org.monte.media.math;
|
|
|
|
import java.math.BigInteger;
|
|
|
|
/**
|
|
* Utility class for integer arithmetic.
|
|
*
|
|
* @author Werner Randelshofer
|
|
* @version $Id: IntMath.java 299 2013-01-03 07:40:18Z werner $
|
|
*/
|
|
public class IntMath {
|
|
|
|
/** Creates a new instance of IntMath */
|
|
public IntMath() {
|
|
}
|
|
|
|
/**
|
|
* Returns an int whose value is the greatest common divisor of
|
|
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
|
* <tt>a==0 && b==0</tt>.
|
|
*
|
|
* @param a value with with the GCD is to be computed.
|
|
* @param b value with with the GCD is to be computed.
|
|
* @return <tt>GCD(a, b)</tt>
|
|
*/
|
|
public static int gcd(int a, int b) {
|
|
// Quelle:
|
|
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
|
// Bonn, München Paris: Addison Wesley.
|
|
// ggt6, Seite 63
|
|
|
|
a = Math.abs(a);
|
|
b = Math.abs(b);
|
|
|
|
while (a > 0 && b > 0) {
|
|
a = a % b;
|
|
if (a > 0) b = b % a;
|
|
}
|
|
return a + b;
|
|
}
|
|
/**
|
|
* Returns a long whose value is the greatest common divisor of
|
|
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
|
* <tt>a==0 && b==0</tt>.
|
|
*
|
|
* @param a value with with the GCD is to be computed.
|
|
* @param b value with with the GCD is to be computed.
|
|
* @return <tt>GCD(a, b)</tt>
|
|
*/
|
|
public static long gcd(long a, long b) {
|
|
// Quelle:
|
|
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
|
// Bonn, München Paris: Addison Wesley.
|
|
// ggt6, Seite 63
|
|
|
|
a = Math.abs(a);
|
|
b = Math.abs(b);
|
|
|
|
while (a > 0 && b > 0) {
|
|
a = a % b;
|
|
if (a > 0) b = b % a;
|
|
}
|
|
return a + b;
|
|
}
|
|
/**
|
|
* Returns a long whose value is the greatest common divisor of
|
|
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
|
* <tt>a==0 && b==0</tt>.
|
|
*
|
|
* @param a value with with the GCD is to be computed.
|
|
* @param b value with with the GCD is to be computed.
|
|
* @return <tt>GCD(a, b)</tt>
|
|
*/
|
|
public static BigInteger gcd(BigInteger a, BigInteger b) {
|
|
// Quelle:
|
|
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
|
// Bonn, München Paris: Addison Wesley.
|
|
// ggt6, Seite 63
|
|
|
|
a = a.abs();
|
|
b = b.abs();
|
|
|
|
while (a.compareTo(BigInteger.ZERO) > 0 && b.compareTo(BigInteger.ZERO) > 0) {
|
|
a = a.mod(b);
|
|
if (a.compareTo(BigInteger.ZERO) > 0) b = b.mod(a);
|
|
}
|
|
return a.add(b);
|
|
}
|
|
|
|
/**
|
|
* Returns an int whose value is the smallest common multiple of
|
|
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
|
* <tt>a==0 || b==0</tt>.
|
|
*
|
|
* @param a value with with the SCM is to be computed.
|
|
* @param b value with with the SCM is to be computed.
|
|
* @return <tt>SCM(a, b)</tt>
|
|
*/
|
|
public static int scm(int a, int b) {
|
|
// Quelle:
|
|
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
|
// Bonn, München Paris: Addison Wesley.
|
|
// gill, Seite 141
|
|
|
|
if (a == 0 || b == 0) return 0;
|
|
|
|
a = Math.abs(a);
|
|
b = Math.abs(b);
|
|
|
|
int u = a;
|
|
int v = b;
|
|
|
|
while (a != b) {
|
|
if (a < b) {
|
|
b -= a;
|
|
v += u;
|
|
} else {
|
|
a -= b;
|
|
u += v;
|
|
}
|
|
}
|
|
|
|
|
|
//return a; // gcd
|
|
return (u + v) / 2; // scm
|
|
}
|
|
/**
|
|
* Returns an int whose value is the smallest common multiple of
|
|
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
|
* <tt>a==0 || b==0</tt>.
|
|
*
|
|
* @param a value with with the SCM is to be computed.
|
|
* @param b value with with the SCM is to be computed.
|
|
* @return <tt>SCM(a, b)</tt>
|
|
*/
|
|
public static long scm(long a, long b) {
|
|
// Quelle:
|
|
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
|
// Bonn, München Paris: Addison Wesley.
|
|
// gill, Seite 141
|
|
|
|
if (a == 0 || b == 0) return 0;
|
|
|
|
a = Math.abs(a);
|
|
b = Math.abs(b);
|
|
if (b==1)return a;
|
|
if (a==1)return b;
|
|
|
|
long u = a;
|
|
long v = b;
|
|
|
|
// FIXME - Handle overflow
|
|
while (a != b) {
|
|
if (a < b) {
|
|
b -= a;
|
|
v += u;
|
|
} else {
|
|
a -= b;
|
|
u += v;
|
|
}
|
|
}
|
|
|
|
|
|
//return a; // gcd
|
|
return (u + v) / 2; // scm
|
|
}
|
|
/**
|
|
* Returns an int whose value is the smallest common multiple of
|
|
* <tt>abs(a)</tt> and <tt>abs(b)</tt>. Returns 0 if
|
|
* <tt>a==0 || b==0</tt>.
|
|
*
|
|
* @param a value with with the SCM is to be computed.
|
|
* @param b value with with the SCM is to be computed.
|
|
* @return <tt>SCM(a, b)</tt>
|
|
*/
|
|
public static BigInteger scm(BigInteger a, BigInteger b) {
|
|
// Quelle:
|
|
// Herrmann, D. (1992). Algorithmen Arbeitsbuch.
|
|
// Bonn, München Paris: Addison Wesley.
|
|
// gill, Seite 141
|
|
|
|
if (a.compareTo(BigInteger.ZERO) == 0 || b.compareTo(BigInteger.ZERO) == 0) {
|
|
return BigInteger.ZERO;
|
|
}
|
|
|
|
a = a.abs();
|
|
b = b.abs();
|
|
if (b.compareTo(BigInteger.ONE)==0)return a;
|
|
if (a.compareTo(BigInteger.ONE)==0)return b;
|
|
|
|
BigInteger u = a;
|
|
BigInteger v = b;
|
|
|
|
// FIXME - Handle overflow
|
|
while (a.compareTo(b) != 0) {
|
|
if (a .compareTo( b)<0) {
|
|
b = b.subtract(a);
|
|
v = v.add(u);
|
|
} else {
|
|
a = a.subtract(b);
|
|
u = u.add(v);
|
|
}
|
|
}
|
|
|
|
|
|
//return a; // gcd
|
|
return (u.add(v)).divide(BigInteger.valueOf(2)); // scm
|
|
}
|
|
|
|
/**
|
|
* Reverses all 32 bits of the provided integer value.
|
|
*/
|
|
public static int reverseBits(int a) {
|
|
return reverseBits(a, 32);
|
|
}
|
|
/**
|
|
* Reverses specified number of bits of the provided integer value.
|
|
* @param a The number.
|
|
* @param numBits The number of bits (must be between 1 and 32).
|
|
*/
|
|
public static int reverseBits(int a, int numBits) {
|
|
int b = 0;
|
|
for (int i=0; i < numBits; i++) {
|
|
b <<= 1;
|
|
b |= (a & 1);
|
|
a >>>= 1;
|
|
}
|
|
return b;
|
|
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
for (int i=0; i < 8; i++) {
|
|
int a = 1<<i;
|
|
int b = reverseBits(a, 3);
|
|
System.out.println(a+" - "+b);
|
|
}
|
|
}
|
|
}
|