Skip to main content
edited body
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one timeonce in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

:~ e# Unwrap sets of isomorphic groups $ e# Sort list e` e# RLE-encode list { }, e# Filter RLE elements: 0= e#  Get number of occurrences 1= e#  Keep element if occurrences == 1 , e# Push length of filtered list e# This is the number of groups up to isomorphism 

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one time in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

:~ e# Unwrap sets of isomorphic groups $ e# Sort list e` e# RLE-encode list { }, e# Filter RLE elements: 0= e# Get number of occurrences 1= e# Keep element if occurrences == 1 , e# Push length of filtered list e# This is the number of groups up to isomorphism 

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly once in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

:~ e# Unwrap sets of isomorphic groups $ e# Sort list e` e# RLE-encode list { }, e# Filter RLE elements: 0= e#  Get number of occurrences 1= e#  Keep element if occurrences == 1 , e# Push length of filtered list e# This is the number of groups up to isomorphism 
deleted 82 characters in body
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10
:L e# List of groups is on stack, store in L ,( e# Push len(L)-1 { }fX e# For X in [0 ... len(L)-2]: LX= e# Push the group L[X] LX)> e# Push a slice of L excluding the first X+1 elements 1$ e# Push a copy of L[X] f{...} e# Pass each [L[X] Y] combination to ... (see below) e# The block will give back a list of yY for isomorphic groups \a+ e# Append L[X] to the isomorphic groups ] e# Wrap everything in a list 

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X]L[X] will never appear in the combinations generated by L[X+...]L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one time in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

(I'll proofreader this tomorrow, I'm tired right now. It should be pretty accurate, anyway)

:L e# List of groups is on stack, store in L ,( e# Push len(L)-1 { }fX e# For X in [0 ... len(L)-2]: LX= e# Push the group L[X] LX)> e# Push a slice of L excluding the first X+1 elements 1$ e# Push a copy of L[X] f{...} e# Pass each [L[X] Y] combination to ... (see below) e# The block will give back a list of y for isomorphic groups \a+ e# Append L[X] to the isomorphic groups ] e# Wrap everything in a list 

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

(I'll proofreader this tomorrow, I'm tired right now. It should be pretty accurate, anyway)

:L e# List of groups is on stack, store in L ,( e# Push len(L)-1 { }fX e# For X in [0 ... len(L)-2]: LX= e# Push the group L[X] LX)> e# Push a slice of L excluding the first X+1 elements 1$ e# Push a copy of L[X] f{...} e# Pass each [L[X] Y] combination to ... (see below) e# The block will give back a list of Y for isomorphic groups \a+ e# Append L[X] to the isomorphic groups ] e# Wrap everything in a list 

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one time in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

added 4889 characters in body
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10

This one's gonna be tough to explain... Time complexity is guaranteed to be O(scary). While writing the explanation I'm seeing a few golfs that I overlooked, but overall I doubt I'll make it much shorter.

If you're brave enough, [try it online][1]online][4]. On my crappy laptop I can get up to 6 with the Java interpreter or 5 in the online interpreter.

I'll be saving periodically as I workGreat, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. There mayThe idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be typos/mistakesaggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one in all sets of isomorphic groups. To do: isomorphism counting this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

:~ e# Unwrap sets of isomorphic groups $ e# Sort list e` e# RLE-encode list { }, e# Filter RLE elements: 0= e# Get number of occurrences 1= e# Keep element if occurrences == 1 , e# Push length of filtered list e# This is the number of groups up to isomorphism 

[1]That's all, folks.

(I'll proofreader this tomorrow, I'm tired right now. It should be pretty accurate, anyway)

[4]: http://cjam.aditsu.net/#code=qi%3AN_3%3E%7B%2CaN*%5DN(%7B%7B%3AL%3BN%2CX)-e!%7BX)%40%2BL%40%40t%7D%25%7BX2%2B%3Cz%7B_fe%3D%3A(%3A%2B%7D%25%3A%2B!%7D%2C%7D%25%3A%2B%7DfX%7B%3AG%3BN3m*%7B~%7BG%40%3D%3D%7D%3AF~F%5C1m%3E~F%5CF%3D%7D%25%3A*%7D%2C%3AL%2C(%7BLX%3DLX)%3E1%24f%7B%5C_%40a%5Ca%2BNe!%5Cf%7B%5C%3AM%3B~%7BM%5Cf%3Dz%7D2*%5CMff%3D%3D%7D%3A%7C%7B%3B%7D%7C%7D%5Ca%2B%7DfX%5D%3A~%24e%60%7B0%3D1%3D%7D%2C%2C%7D%7B!!%7D%3F&input=4 [2]: https://en.wikipedia.org/wiki/Cayley_table [3]: https://en.wikipedia.org/wiki/Latin_square

This one's gonna be tough to explain... Time complexity is guaranteed to be O(scary). While writing the explanation I'm seeing a few golfs that I overlooked, but overall I doubt I'll make it much shorter.

If you're brave enough, [try it online][1]. On my crappy laptop I can get up to 6 with the Java interpreter or 5 in the online interpreter.

I'll be saving periodically as I work. There may be typos/mistakes. To do: isomorphism counting.

[1]: http://cjam.aditsu.net/#code=qi%3AN_3%3E%7B%2CaN*%5DN(%7B%7B%3AL%3BN%2CX)-e!%7BX)%40%2BL%40%40t%7D%25%7BX2%2B%3Cz%7B_fe%3D%3A(%3A%2B%7D%25%3A%2B!%7D%2C%7D%25%3A%2B%7DfX%7B%3AG%3BN3m*%7B~%7BG%40%3D%3D%7D%3AF~F%5C1m%3E~F%5CF%3D%7D%25%3A*%7D%2C%3AL%2C(%7BLX%3DLX)%3E1%24f%7B%5C_%40a%5Ca%2BNe!%5Cf%7B%5C%3AM%3B~%7BM%5Cf%3Dz%7D2*%5CMff%3D%3D%7D%3A%7C%7B%3B%7D%7C%7D%5Ca%2B%7DfX%5D%3A~%24e%60%7B0%3D1%3D%7D%2C%2C%7D%7B!!%7D%3F&input=4 [2]: https://en.wikipedia.org/wiki/Cayley_table [3]: https://en.wikipedia.org/wiki/Latin_square

This one's gonna be tough to explain... Time complexity is guaranteed to be O(scary).

If you're brave enough, [try it online][4]. On my crappy laptop I can get up to 6 with the Java interpreter or 5 in the online interpreter.

Great, now we have a list of sets like [{L[0], Y1, Y2, ...}, {L[1], Y1, ...}, ...]. The idea here is that, by transitive property, if any two sets have at least one element in common then all the groups in the two sets are isomorphic. They can be aggregated into a single set. As L[X] will never appear in the combinations generated by L[X+...], after aggregating each set of isomorphisms will have one unique element. So, to get the number of isomorphisms, it's sufficient to count how many groups appear exactly one in all sets of isomorphic groups. To do this, I unwrap the sets so they look like [L[0], Y1, Y2, ..., L[1], Y1, ...], sort the list to create clusters of the same group and finally RLE-encode it.

:~ e# Unwrap sets of isomorphic groups $ e# Sort list e` e# RLE-encode list { }, e# Filter RLE elements: 0= e# Get number of occurrences 1= e# Keep element if occurrences == 1 , e# Push length of filtered list e# This is the number of groups up to isomorphism 

That's all, folks.

(I'll proofreader this tomorrow, I'm tired right now. It should be pretty accurate, anyway)

[4]: http://cjam.aditsu.net/#code=qi%3AN_3%3E%7B%2CaN*%5DN(%7B%7B%3AL%3BN%2CX)-e!%7BX)%40%2BL%40%40t%7D%25%7BX2%2B%3Cz%7B_fe%3D%3A(%3A%2B%7D%25%3A%2B!%7D%2C%7D%25%3A%2B%7DfX%7B%3AG%3BN3m*%7B~%7BG%40%3D%3D%7D%3AF~F%5C1m%3E~F%5CF%3D%7D%25%3A*%7D%2C%3AL%2C(%7BLX%3DLX)%3E1%24f%7B%5C_%40a%5Ca%2BNe!%5Cf%7B%5C%3AM%3B~%7BM%5Cf%3Dz%7D2*%5CMff%3D%3D%7D%3A%7C%7B%3B%7D%7C%7D%5Ca%2B%7DfX%5D%3A~%24e%60%7B0%3D1%3D%7D%2C%2C%7D%7B!!%7D%3F&input=4 [2]: https://en.wikipedia.org/wiki/Cayley_table [3]: https://en.wikipedia.org/wiki/Latin_square

added 4889 characters in body
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10
Loading
added 4889 characters in body
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10
Loading
added 4889 characters in body
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10
Loading
Source Link
Andrea Biondo
  • 1.4k
  • 9
  • 10
Loading