June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,172 @@
import std.stdio;
int inv(int a) {
return a ^ -1;
}
class Zeckendorf {
private int dVal;
private int dLen;
private void a(int n) {
auto i = n;
while (true) {
if (dLen < i) dLen = i;
auto j = (dVal >> (i * 2)) & 3;
switch(j) {
case 0:
case 1:
return;
case 2:
if (((dVal >> ((i + 1) * 2)) & 1) != 1) return;
dVal += 1 << (i * 2 + 1);
return;
case 3:
dVal = dVal & (3 << (i * 2)).inv();
b((i + 1) * 2);
break;
default:
assert(false);
}
i++;
}
}
private void b(int pos) {
if (pos == 0) {
this++;
return;
}
if (((dVal >> pos) & 1) == 0) {
dVal += 1 << pos;
a(pos / 2);
if (pos > 1) a(pos / 2 - 1);
} else {
dVal = dVal & (1 << pos).inv();
b(pos + 1);
b(pos - (pos > 1 ? 2 : 1));
}
}
private void c(int pos) {
if (((dVal >> pos) & 1) == 1) {
dVal = dVal & (1 << pos).inv();
return;
}
c(pos + 1);
if (pos > 0) {
b(pos - 1);
} else {
++this;
}
}
this(string x = "0") {
int q = 1;
int i = x.length - 1;
dLen = i / 2;
while (i >= 0) {
dVal += (x[i] - '0') * q;
q *= 2;
i--;
}
}
auto opUnary(string op : "++")() {
dVal += 1;
a(0);
return this;
}
void opOpAssign(string op : "+")(Zeckendorf rhs) {
foreach (gn; 0..(rhs.dLen + 1) * 2) {
if (((rhs.dVal >> gn) & 1) == 1) {
b(gn);
}
}
}
void opOpAssign(string op : "-")(Zeckendorf rhs) {
foreach (gn; 0..(rhs.dLen + 1) * 2) {
if (((rhs.dVal >> gn) & 1) == 1) {
c(gn);
}
}
while ((((dVal >> dLen * 2) & 3) == 0) || (dLen == 0)) {
dLen--;
}
}
void opOpAssign(string op : "*")(Zeckendorf rhs) {
auto na = rhs.dup;
auto nb = rhs.dup;
Zeckendorf nt;
auto nr = "0".Z;
foreach (i; 0..(dLen + 1) * 2) {
if (((dVal >> i) & 1) > 0) nr += nb;
nt = nb.dup;
nb += na;
na = nt.dup;
}
dVal = nr.dVal;
dLen = nr.dLen;
}
void toString(scope void delegate(const(char)[]) sink) const {
if (dVal == 0) {
sink("0");
return;
}
sink(dig1[(dVal >> (dLen * 2)) & 3]);
foreach_reverse (i; 0..dLen) {
sink(dig[(dVal >> (i * 2)) & 3]);
}
}
Zeckendorf dup() {
auto z = "0".Z;
z.dVal = dVal;
z.dLen = dLen;
return z;
}
enum dig = ["00", "01", "10"];
enum dig1 = ["", "1", "10"];
}
auto Z(string val) {
return new Zeckendorf(val);
}
void main() {
writeln("Addition:");
auto g = "10".Z;
g += "10".Z;
writeln(g);
g += "10".Z;
writeln(g);
g += "1001".Z;
writeln(g);
g += "1000".Z;
writeln(g);
g += "10101".Z;
writeln(g);
writeln();
writeln("Subtraction:");
g = "1000".Z;
g -= "101".Z;
writeln(g);
g = "10101010".Z;
g -= "1010101".Z;
writeln(g);
writeln();
writeln("Multiplication:");
g = "1001".Z;
g *= "101".Z;
writeln(g);
g = "101010".Z;
g += "101".Z;
writeln(g);
}

View file

@ -0,0 +1,186 @@
import java.util.List;
public class Zeckendorf implements Comparable<Zeckendorf> {
private static List<String> dig = List.of("00", "01", "10");
private static List<String> dig1 = List.of("", "1", "10");
private String x;
private int dVal = 0;
private int dLen = 0;
public Zeckendorf() {
this("0");
}
public Zeckendorf(String x) {
this.x = x;
int q = 1;
int i = x.length() - 1;
dLen = i / 2;
while (i >= 0) {
dVal += (x.charAt(i) - '0') * q;
q *= 2;
i--;
}
}
private void a(int n) {
int i = n;
while (true) {
if (dLen < i) dLen = i;
int j = (dVal >> (i * 2)) & 3;
switch (j) {
case 0:
case 1:
return;
case 2:
if (((dVal >> ((i + 1) * 2)) & 1) != 1) return;
dVal += 1 << (i * 2 + 1);
return;
case 3:
int temp = 3 << (i * 2);
temp ^= -1;
dVal = dVal & temp;
b((i + 1) * 2);
break;
}
i++;
}
}
private void b(int pos) {
if (pos == 0) {
Zeckendorf thiz = this;
thiz.inc();
return;
}
if (((dVal >> pos) & 1) == 0) {
dVal += 1 << pos;
a(pos / 2);
if (pos > 1) a(pos / 2 - 1);
} else {
int temp = 1 << pos;
temp ^= -1;
dVal = dVal & temp;
b(pos + 1);
b(pos - (pos > 1 ? 2 : 1));
}
}
private void c(int pos) {
if (((dVal >> pos) & 1) == 1) {
int temp = 1 << pos;
temp ^= -1;
dVal = dVal & temp;
return;
}
c(pos + 1);
if (pos > 0) {
b(pos - 1);
} else {
Zeckendorf thiz = this;
thiz.inc();
}
}
public Zeckendorf inc() {
dVal++;
a(0);
return this;
}
public void plusAssign(Zeckendorf other) {
for (int gn = 0; gn < (other.dLen + 1) * 2; gn++) {
if (((other.dVal >> gn) & 1) == 1) {
b(gn);
}
}
}
public void minusAssign(Zeckendorf other) {
for (int gn = 0; gn < (other.dLen + 1) * 2; gn++) {
if (((other.dVal >> gn) & 1) == 1) {
c(gn);
}
}
while ((((dVal >> dLen * 2) & 3) == 0) || (dLen == 0)) {
dLen--;
}
}
public void timesAssign(Zeckendorf other) {
Zeckendorf na = other.copy();
Zeckendorf nb = other.copy();
Zeckendorf nt;
Zeckendorf nr = new Zeckendorf();
for (int i = 0; i < (dLen + 1) * 2; i++) {
if (((dVal >> i) & 1) > 0) {
nr.plusAssign(nb);
}
nt = nb.copy();
nb.plusAssign(na);
na = nt.copy();
}
dVal = nr.dVal;
dLen = nr.dLen;
}
private Zeckendorf copy() {
Zeckendorf z = new Zeckendorf();
z.dVal = dVal;
z.dLen = dLen;
return z;
}
@Override
public int compareTo(Zeckendorf other) {
return ((Integer) dVal).compareTo(other.dVal);
}
@Override
public String toString() {
if (dVal == 0) {
return "0";
}
int idx = (dVal >> (dLen * 2)) & 3;
StringBuilder stringBuilder = new StringBuilder(dig1.get(idx));
for (int i = dLen - 1; i >= 0; i--) {
idx = (dVal >> (i * 2)) & 3;
stringBuilder.append(dig.get(idx));
}
return stringBuilder.toString();
}
public static void main(String[] args) {
System.out.println("Addition:");
Zeckendorf g = new Zeckendorf("10");
g.plusAssign(new Zeckendorf("10"));
System.out.println(g);
g.plusAssign(new Zeckendorf("10"));
System.out.println(g);
g.plusAssign(new Zeckendorf("1001"));
System.out.println(g);
g.plusAssign(new Zeckendorf("1000"));
System.out.println(g);
g.plusAssign(new Zeckendorf("10101"));
System.out.println(g);
System.out.println("\nSubtraction:");
g = new Zeckendorf("1000");
g.minusAssign(new Zeckendorf("101"));
System.out.println(g);
g = new Zeckendorf("10101010");
g.minusAssign(new Zeckendorf("1010101"));
System.out.println(g);
System.out.println("\nMultiplication:");
g = new Zeckendorf("1001");
g.timesAssign(new Zeckendorf("101"));
System.out.println(g);
g = new Zeckendorf("101010");
g.plusAssign(new Zeckendorf("101"));
System.out.println(g);
}
}

View file

@ -0,0 +1,156 @@
// version 1.1.51
class Zeckendorf(x: String = "0") : Comparable<Zeckendorf> {
var dVal = 0
var dLen = 0
private fun a(n: Int) {
var i = n
while (true) {
if (dLen < i) dLen = i
val j = (dVal shr (i * 2)) and 3
when (j) {
0, 1 -> return
2 -> {
if (((dVal shr ((i + 1) * 2)) and 1) != 1) return
dVal += 1 shl (i * 2 + 1)
return
}
3 -> {
dVal = dVal and (3 shl (i * 2)).inv()
b((i + 1) * 2)
}
}
i++
}
}
private fun b(pos: Int) {
if (pos == 0) {
var thiz = this
++thiz
return
}
if (((dVal shr pos) and 1) == 0) {
dVal += 1 shl pos
a(pos / 2)
if (pos > 1) a(pos / 2 - 1)
}
else {
dVal = dVal and (1 shl pos).inv()
b(pos + 1)
b(pos - (if (pos > 1) 2 else 1))
}
}
private fun c(pos: Int) {
if (((dVal shr pos) and 1) == 1) {
dVal = dVal and (1 shl pos).inv()
return
}
c(pos + 1)
if (pos > 0) b(pos - 1) else { var thiz = this; ++thiz }
}
init {
var q = 1
var i = x.length - 1
dLen = i / 2
while (i >= 0) {
dVal += (x[i] - '0').toInt() * q
q *= 2
i--
}
}
operator fun inc(): Zeckendorf {
dVal += 1
a(0)
return this
}
operator fun plusAssign(other: Zeckendorf) {
for (gn in 0 until (other.dLen + 1) * 2) {
if (((other.dVal shr gn) and 1) == 1) b(gn)
}
}
operator fun minusAssign(other: Zeckendorf) {
for (gn in 0 until (other.dLen + 1) * 2) {
if (((other.dVal shr gn) and 1) == 1) c(gn)
}
while ((((dVal shr dLen * 2) and 3) == 0) || (dLen == 0)) dLen--
}
operator fun timesAssign(other: Zeckendorf) {
var na = other.copy()
var nb = other.copy()
var nt: Zeckendorf
var nr = "0".Z
for (i in 0..(dLen + 1) * 2) {
if (((dVal shr i) and 1) > 0) nr += nb
nt = nb.copy()
nb += na
na = nt.copy()
}
dVal = nr.dVal
dLen = nr.dLen
}
override operator fun compareTo(other: Zeckendorf) = dVal.compareTo(other.dVal)
override fun toString(): String {
if (dVal == 0) return "0"
val sb = StringBuilder(dig1[(dVal shr (dLen * 2)) and 3])
for (i in dLen - 1 downTo 0) {
sb.append(dig[(dVal shr (i * 2)) and 3])
}
return sb.toString()
}
fun copy(): Zeckendorf {
val z = "0".Z
z.dVal = dVal
z.dLen = dLen
return z
}
companion object {
val dig = listOf("00", "01", "10")
val dig1 = listOf("", "1", "10")
}
}
val String.Z get() = Zeckendorf(this)
fun main(args: Array<String>) {
println("Addition:")
var g = "10".Z
g += "10".Z
println(g)
g += "10".Z
println(g)
g += "1001".Z
println(g)
g += "1000".Z
println(g)
g += "10101".Z
println(g)
println("\nSubtraction:")
g = "1000".Z
g -= "101".Z
println(g)
g = "10101010".Z
g -= "1010101".Z
println(g)
println("\nMultiplication:")
g = "1001".Z
g *= "101".Z
println(g)
g = "101010".Z
g += "101".Z
println(g)
}